Mockito:如何测试调用了构造函数?

新手上路,请多包涵

我正在使用 Mockito 来测试我的 Java 应用程序中的方法。

如何测试构造函数是否被调用一次?

我正在尝试进行类似于此的验证:

 verify(myClass, times(1)).doSomething(anotherObject);

但是我无法验证是否调用了构造函数,因为它没有类似于 doSomething() 的方法。

原文由 java123999 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

这不能用 Mockito 完成,因为正在创建的对象不是模拟对象。这也意味着您将无法验证该新对象上的任何内容。

过去,我通过使用 Factory 创建对象而不是更新对象来解决这种情况。然后,您可以模拟 Factory 以返回测试所需的对象。

您是否愿意更改设计以适合您的测试取决于您!

原文由 StuPointerException 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用 Mockito 和 PowerMockito 来完成。

假设您有一个带有构造函数的 ClassUnderTest

 public class ClassUnderTest {
    String name;
    boolean condition;

    public ClassUnderTest(String name, boolean condition) {
       this.name = name;
       this.condition = condition;
       init();
    }

    ...
}

另一个调用该构造函数的类

public class MyClass {

    public MyClass() { }

    public void createCUTInstance() {
       // ...
       ClassUnderTest cut = new ClassUnderTest("abc", true);
       // ...
    }

    ...
}

在测试课上我们可以…

(1) 使用 PowerMockRunner 并在 PrepareForTest 注释中引用上面的两个目标类:

 @RunWith(PowerMockRunner.class)
@PrepareForTest({ ClassUnderTest.class, MyClass.class })
public class TestClass {

(2)拦截构造函数返回一个mock对象:

 @Before
public void setup() {
    ClassUnderTest cutMock = Mockito.mock(ClassUnderTest.class);
    PowerMockito.whenNew(ClassUnderTest.class)
                .withArguments(Matchers.anyString(), Matchers.anyBoolean())
                .thenReturn(cutMock);
}

(3) 验证构造函数调用:

 @Test
public void testMethod() {
    // prepare
    MyClasss myClass = new MyClass();

    // execute
    myClass.createCUTInstance();

    // checks if the constructor has been called once and with the expected argument values:
    String name = "abc";
    String condition = true;
    PowerMockito.verifyNew(ClassUnderTest.class).withArguments(name, condition);
}

原文由 Jose Tepedino 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题