繁体   English   中英

为什么我的模拟测试总是通过返回null但必须返回String的方法

[英]Why my mock test always pass for method which returns null but must return String

我正在测试以检查方法是否返回正确的字符串。 但是,即使方法返回null ,测试也将通过! 为什么会发生? 如何正确编写测试? 谢谢!

// TestMyObj.java: My test class
public class TestMyObj {
    @InjectMocks
    private MyClass myClass;

    @Mock
    TestObj testObj;

    private final String test = "test";

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);  // or use mockito runner
    }

    @Test
    public void test() {
        when(testObj.get()).thenReturn(test);
        Assert.assertTrue(myClass.get().equals(test));
        verify(testObj).get();
    }
}

// MyClass.java: Class which uses my object
public class MyClass {
    private TestObj testObj;

    public MyClass() {}
    public MyClass(TestObj testObj) { this.testObj = testObj; }
    String get() { return testObj.get(); }
}

// TestObj.java: My testing object 
public class TestObj {
    String get() { return null; }
}

myClass.get()返回testObj.get() ; 同时,使用when(...)指示testObj.get()返回test

因此myClass.get()基本上等同于test ,而Assert.assertTrue(myClass.get().equals(test)) Assert.assertTrue(test.equals(test))Assert.assertTrue(test.equals(test)) ,当test不为null时,断言ok(并且在您的情况下不为null )。

顺便说一句

Assert.assertTrue(expected.equals(actual));

最好写

Assert.assertEquals(expected, actual);

它将为您提供有关故障的诊断消息,从中您将看到期望的值以及为第二个参数实际赋予的值。

所以我会像这样重写相同的测试

@Test
public void test() {
    when(testObj.get()).thenReturn("test");
    assertEquals("test", myClass.get());
    verify(testObj).get();
}

这似乎是有道理的:我们正在测试MyClass正确调用其协作者testObj并将其返回值返回给我们。

在这里使用常量而不是test变量似乎是正确的选择。 首先,由于常量在两条相邻的行中使用,因此“我在一个位置更改了常量却忘记了在另一个位置进行了操作”没有问题。 其次,现在没有间接级别(随该test变量引入),因此代码更易于理解。

正如其他人所解释的那样-首先请仔细阅读您所使用的概念。

这里的关键:你在嘲笑你的测试类的该实例。 因此,返回null的方法的实际实现根本不重要。 因为您创建了一个模拟对象并指示Mockito在调用get()时返回非null值。 因此,返回null的真实方法主体永远不会在您显示给我们的代码中执行。

这就是全部。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM