如何使用Mockito模拟Spring ApplicationContext的getBean方法来编写TestNG的单元测试?

时间:2017-04-20 17:47:59

标签: java spring mockito testng

我正在为以下课程编写单元测试

要测试的类:

public class RandomManager {
        @Autowired
        private ApplicationContext context;

        @Autowired
        private ClassA objectA;

        public void methodToBeTested() {
            objectA.methodToBeVerified(context.getBean(Random.class,"Yaswanth","Yaswanth"));
        }
    }

以下是测试类:

public class RandomManagerTest {

    @Mock
    private ClassA objectA;

    @Mock
    private ApplicationContext context;

    @InjectMocks
    private RandomManager randomManager;

    @BeforeTest
    public void before() {
        MockitoAnnotations.initMocks(this);
        doReturn(any(Random.class)).when(context)
            .getBean(any(Class.class), any(), any());
    }

    @Test
    public void methodToBeTestedTest() {
        Random randomObject = new RandomObject("Yaswanth", "Yaswanth");
        randomManager.methodToBeTested();
        verify(objectA).methodToBeVerified(randomObject);
    }
}

当我尝试存根时,上面的代码在before方法中失败了 applicationContext mock。我收到以下错误。

  

您不能在验证或存根之外使用参数匹配器。   正确使用参数匹配器的示例:      当(mock.get(anyInt()))thenReturn(空)。      doThrow(new RuntimeException())。when(mock).someVoidMethod(anyObject());       验证(模拟).someMethod(含有("富&#34))

     

如果是最后一个,则在NullPointerException之后可能会出现此消息   matcher返回一个像any()但是stubbed方法的对象   签名期望一个原始参数,在这种情况下,使用原语   备择方案。       当(mock.get(任何())); //使用不当,会引发NPE       当(mock.get(anyInt())); //正确使用

     

此外,此错误可能会显示,因为您使用参数匹配器   无法模拟的方法。以下方法不能   stubbed / verified:final / private / equals()/ hashCode()。嘲弄方法   不支持在非公共父类上声明。

任何人都可以帮助我理解我做错了什么 上面的代码?

注意:我正在使用TestNG和Mockito。我可以扩展 AbstractTestNGSpringContextTests并使用spring-test.xml,声明我的 bean和autowire applicationContext。我觉得这太过分了 我的用例。我只需要模拟applicationContext的getBean方法。

1 个答案:

答案 0 :(得分:1)

问题来自doReturn(any(Random.class)),您无法使用any()。 只需用真实实例替换它。