用不同的值模拟一个方法

时间:2015-03-25 12:58:12

标签: java junit mockito

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

问题在于,当我运行test()方法时,help valiable的返回值为“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");
      }*/
}

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

1 个答案:

答案 0 :(得分:2)

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

使用when(test.getHelp(a))时,mockito将使用a的{​​{1}}方法检查参数是否匹配。如果是equals方法始终返回equals,它将无法与true区分a。我已经使用重写b方法运行您的代码(即equals个对象只有在它们是同一个实例时才相等)并且两个测试都已通过。

您可能希望使用参数匹配器 - HelpClass不依赖于when(test.getHelp(argThat(sameInstance(a))))方法。如果您需要比equals更复杂的内容,我建议shazamcrest使用sameInstance匹配器。