用不同的值模拟一种方法



我对Mockito仍然有一些困难。我想为两个不同的对象示例提供两个测试用例。因此,我想根据参数值模拟不同的方法行为。

问题是,当我运行test()方法时,help validable的返回值是"b",并且断言不返回true。如果我对标记为(***)的行进行注释,则一切正常。

正如你所看到的,我尝试使用thenAnswer而不是thenReturn,但结果是一样的。

public class TestItAll {
      TestClass test;
      HelpClass a ;
      HelpClass b;
      @Before
      public void init(){
          a = new HelpClass("a");
          b = new HelpClass("b");
          Mockito.when(test.getHelp(a)).thenReturn("a");
          /*Mockito.when(test.getHelp(a)).thenAnswer(
            new Answer< String>() {
                  public String answer(InvocationOnMock invocation) {
                      return "a";
                  }
            });         */
          Mockito.when(test.getHelp(b)).thenReturn("b");//(***)
          /*Mockito.when(test.getHelp(b)).thenAnswer(
            new Answer< String>() {
                  public String answer(InvocationOnMock invocation) {
                      return "b";
                  }
            });         */
      }

      @Test
      public void testA(){
          String help= test.getHelp(a);
          Assert.assertEquals(help, "a");
      }
      /*@Test
      public void testB(){
          String help= test.getHelp(b);
          Assert.assertEquals(help, "b");
      }*/
}

请不要问我为什么嘲笑一个测试对象。这只是一个更复杂情况的典型例子。

首先,我假设您的声明TestClass test;实际上是TestClass test = mock(TestClass.class);,否则@Before方法抛出NullPointerException

当使用when(test.getHelp(a))时,mockito将使用aequals方法来检查参数是否匹配。例如,如果equals方法总是返回true,则它将无法区分ab。我已经用重写equals方法运行了您的代码(即,只有当HelpClass对象是同一实例时,它们才相等),并且两个测试都通过了。

您可能希望使用参数匹配器-when(test.getHelp(argThat(sameInstance(a))))来不依赖于您的equals方法。如果你需要比sameInstance更复杂的东西,我推荐来自shazamcrest的sameBeanAs匹配器。

相关内容

  • 没有找到相关文章

最新更新