Junit @参数化测试:使用参数作为模拟对象的返回值

hiz5n14c  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(129)

我正在用Junit写一个ParametrizedTest,这个测试的参数来自一个枚举源代码。
我想用这个枚举构造一个对象,并让模拟方法返回这个对象。
但是,当我试图这样做时,我得到(我认为是)一个不相关的错误消息。

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"))

下面是代码:
第一个
我怀疑输入应该不是any(),所以我创建了一个为测试提供数据的方法,并使用了@MethodSource注解。
该方法将输入的参数返回给mock,并期望mock返回。

@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())
      )
   }

}

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

4smxwvx5

4smxwvx51#

我使用的运行程序不正确。我把它改成了使用MockitoExtension,测试运行得很好。

@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())
      )
   }

相关问题