java - 模拟具有不同值的一种方法

标签 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");
      }*/
}

请不要问我为什么要 mock 测试对象。这只是更复杂情况的一个模型示例。

最佳答案

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

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

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

关于java - 模拟具有不同值的一种方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29256358/

相关文章:

java - 如何使用自定义@Rule正确配置@RunWith(Parameterized.class) + SpringClassRule + SpringMethodRule?

java - 如何模拟下游方法调用?

java - 如何为手动依赖注入(inject)创建mockito测试

java - Mockito 比 EasyMock 更受欢迎?

java - 哪种类型的网络应用程序实际上会受到 float 错误的影响?

java - 使用 WebSphere 在 RSA (Rational Software Architect) 上设置 Spring + Maven

java - Android 工作室设备

java - 运行 junit 测试一定时间

java - 在一个方法中使用多个测试用例进行 JUnit 测试

Java 数据库插入失败