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



我正在努力检查方法是否返回正确的字符串。但是,即使方法返回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; }
}

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

这里的关键因素:您是模拟测试类的实例。因此,返回零的方法的真实实施根本无关紧要。因为您创建一个模拟的对象并指示Mockito在to Get()的呼叫时返回非零值。因此,在您向我们显示的代码中,从未执行真正的方法主体返回null。

这就是全部。

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

因此, myClass.get()基本上等同于 test,而 Assert.assertTrue(myClass.get().equals(test))降低到 Assert.assertTrue(test.equals(test)),当 test不是 null时,它声称确定确定(并且在您的情况下不是 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变量引入),因此代码更容易理解。

相关内容

  • 没有找到相关文章

最新更新