首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Junit @ParametrizedTest:使用参数作为模拟对象的返回值

Junit @ParametrizedTest:使用参数作为模拟对象的返回值
EN

Stack Overflow用户
提问于 2022-10-28 02:37:26
回答 1查看 20关注 0票数 0

我正在用Junit写一个ParametrizedTest。该测试的论据来自于一个枚举源。

我希望用该枚举构造一个对象,并使模拟的方法返回该对象。

然而,当我尝试这样做时,我得到(我认为是)一个不相关的错误消息。

代码语言:javascript
运行
复制
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Misplaced or misused argument matcher detected here:  

You cannot use argument matchers outside of verification or stubbing.
Examples of correct usage of argument matchers:
when(mock.get(anyInt())).thenReturn(null);
doThrow(new RuntimeException()).when(mock).someVoidMethod(anyObject());
verify(mock).someMethod(contains("foo"))

以下是代码:

代码语言:javascript
运行
复制
public static enum CodeEnum {
   S1("S1"),
   S2("S2)
}
代码语言:javascript
运行
复制
@RunWith(MockitoJUnitRunner.class)
public class FooTest {
   
   @Mocked
   MockedObject mockedObject;
   
   @InjectMocks
   Foo underTest

   @ParameterizedTest
   @EnumSource(CodeEnum.class)
   public void test_ParametrizedTest(CodeEnum enum) {
      
      Output expectedReturn = Output.builder().code(enum).build();
      
      // Given
      when(mockedObject.method(any()))
          .thenReturn(expectedReturn);
      
      // when 
      val result = underTest.method();
      
      // then
      assertEquas(enum, result.getCode())

   }

}

我怀疑输入不应该是any(),所以我创建了一个为测试提供数据的方法,并使用了@MethodSource注释。

该方法将输入的参数返回给模拟,并从模拟返回expectedReturn。

代码语言:javascript
运行
复制
   @RunWith(MockitoJUnitRunner.class)
   public class FooTest {

      @Mocked
      MockedObject mockedObject;

      @InjectMocks
      Foo underTest

      @ParameterizedTest
      @MethodSource("dataProvider")
      public void test_ParametrizedTest(MockedInput mockedInput, Output expectedReturn) {

         Output expectedReturn = Output.builder().code(enum).build();

         // Given
         when(mockedObject.method(mockedInput))
            .thenReturn(expectedReturn);

        // when 
        val result = underTest.method();

        // then
        assertEquas(enum, result.getCode())

   }
   
   private static Stream<Arguments> dataProvider() {
      return Stream.of(
               Arguments.of(mockedInput1, Output.builder().code(CodeEnum.S1).build()),
               Arguments.of(mockedInput2, Output.builder().code(CodeEnum.S2).build())
      )
   }

}

如何使模拟对象从参数化测试返回参数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-01 04:51:58

我所用的跑步者是不正确的。我将其更改为使用MockitoExtension,测试运行良好。

代码语言:javascript
运行
复制
@ExtendWith(MockitoExtension.class)
public class FooTest {

      @Mocked
      MockedObject mockedObject;

      @InjectMocks
      Foo underTest

      @ParameterizedTest
      @MethodSource("dataProvider")
      public void test_ParametrizedTest(MockedInput mockedInput, Output expectedReturn) {

         Output expectedReturn = Output.builder().code(enum).build();

         // Given
         when(mockedObject.method(mockedInput))
            .thenReturn(expectedReturn);

        // when 
        val result = underTest.method();

        // then
        assertEquas(enum, result.getCode())

   }
   
   private static Stream<Arguments> dataProvider() {
      return Stream.of(
               Arguments.of(mockedInput1, Output.builder().code(CodeEnum.S1).build()),
               Arguments.of(mockedInput2, Output.builder().code(CodeEnum.S2).build())
      )
   }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74230080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档