使用构造函数上的参数测试抽象类

2022-09-02 23:50:55

我正在尝试学习测试,但在测试抽象类时遇到了一些问题。我知道我可以创建一个从Dog继承的具体子类,就像ConcreteDog一样,但是如果我向Dog添加一个新的抽象方法,我将不得不向ConcreteDog添加一个空方法。我想那不会那么酷。

public abstract class Dog {
  private final int id;

  public Dog(int id) {
    this.id = id;
  }

  public int getId() {
    return id;
  }

  public abstract void makeSound();
}

...

public class DogTest {
  @Test
  public void testGetId() {
    int id = 42;

    // How to pass id to Dog constructor ?
    Dog dog = Mockito.mock(Dog.class, Mockito.CALL_REAL_METHODS);

    assertTrue(dog.getId() == id);
  }
}

我试图做的是以某种方式用构造函数调用Mock,比如

Mockito.mock(Dog(id).class, Mockito.CALL_REAL_METHODS);

我不知道使用mockito是否可行,但是有一种方法可以使用mockito或其他工具来做到这一点?


答案 1

你可以这样做:

Mockito.mock(Dog.class, Mockito.withSettings()
        .useConstructor(999)
        .defaultAnswer(Mockito.CALLS_REAL_METHODS)
);

其中 - 是参数的任何整数。因此,您不必再继承抽象类。您还可以传递所需构造函数的任意数量的参数,例如:999id

.useConstructor(new Object(), "my string", 5.5, null)

答案 2

如果需要,可以使用反射来设置字段,这实质上复制了构造函数设置成员字段的方式。

Dog dog = Mockito.mock(Dog.class, Mockito.CALL_REAL_METHODS);
ReflectionTestUtils.setField(dog , "id", 42);

推荐