当前位置: 首页 > 知识库问答 >
问题:

如何使用mockito mocked bean测试spring bean

龙焱
2023-03-14

我希望能够测试一条从队列中消耗的路由,然后在涉及spring注入服务的bean中进行一些工作,并使用mockito有效地模拟该服务。

我的Spring路线如下:

    <camel:route id="msgemailqueue-to-emailservice">        
        <camel:from uri="activemq:emails" />
        <camel:bean ref="emailService" method="createEmailRequest"/>            
    </camel:route>

emailService bean有一个自动连接的服务,然后在createEmailRequest()中调用该服务,该服务将转到另一个服务并检索用户数据以供后续使用。

测试:

@RunWith(MockitoJUnitRunner.class)
public class TroubledEmailServiceImplTest extends CamelSpringTestSupport {

    @Produce(context = "messagingCamelContext")
    protected ProducerTemplate producer;

    @Mock
    private UserRestService userRestService;

    @Override
    protected AbstractApplicationContext createApplicationContext() {
        return new ClassPathXmlApplicationContext("messaging-camel-route-test-context.xml");
    }

    @Test
    public void testUserResponseToEmailQueue() throws Exception {
        context.addRoutes(new MyDynamcRouteBuilder(context, "direct:addEmailRequest", "activemq:emails"));

        Mockito.when(userRestService.getUserById(Mockito.anyLong())).thenReturn(
            new WebServiceResult<UserVO>(new UserVO()));

        CreateMessageRequest msgReq = new CreateMessageRequest();
        producer.sendBody("direct:addEmailRequest", msgReq);

        Mockito.verify(userRestService).getUserById(Mockito.anyLong());
        assertMockEndpointsSatisfied();
   }

bean如下:

@Override
public void createEmailRequest(final CreateMessageRequest request) throws CreateEmailException {

    LOGGER.trace("Entering createEmailRequest(request) " + Arrays.asList(new Object[] { request }));

    Validate.notNull(request, "CreateMessageRequest was null");

    WebServiceResult<UserVO> response;
    try {
        response = userRestService.getUserById(request.getId());
    } catch (final WebServiceException e) {
        throw new CreateEmailException("Error lookup up user data for email", e);
    }

    final UserVO userResponse = response.getData();

所有编译都正常,当运行路由时,队列上弹出一个对象,然后将其传递给bean,调用createEmailRequest,对mockito mocked服务的调用正常

response = userRestService.getUserById(request.getId());

但是,即使

        Mockito.when(userRestService.getUserById(Mockito.anyLong())).thenReturn(
            new WebServiceResult<UserVO>(new UserVO()));

在测试中进行了测试。bean中的服务似乎是另一个实例,即mockito mock从未被调用。

我做了一些错误的事情,也许我的测试方法也是错误的,但是这在理论上应该有效吗?我真的很想能够在我的骆驼路线上模拟出一个豆子里的服务。

共有3个答案

阙庆
2023-03-14

我已经解决了这个问题——我的错。我的测试类有效地创建了两个服务实例——一个是通过Spring应用程序上下文,另一个是由于@RunBy(MockitoJUnitRunner.class)加上@mock注释。现在通过做一次模拟创建来解决。总而言之,这只是我的一个Spring布线问题。非常感谢@mike-pone。

湛宏旷
2023-03-14

您在测试中创建的模拟userRestService必须与您在bean中使用的实例相同。我看不到您在哪里为createEmailRequest方法设置userRestService。该服务需要与您在测试中创建的模拟对象相同。

冯良才
2023-03-14

我正在使用Camel增强型Spring测试,并且已经通过了相同的问题。我只把@Mock改成了@MockBean。我的骆驼版本是2.18。

 类似资料:
  • 问题内容: 我正在使用JavaScript测试运行程序“摩卡”。 我的测试失败了,因此我将使用进行调试。 但是运行测试时,没有输出(仅来自Mocha的测试结果)。看来Mocha已捕获并抑制了我的输出! 如何让Mocha显示输出?(对于失败的测试)? 编辑: 抱歉!- 在测试期间可以正常工作!我肯定一直期望它抑制输出,而且我没有正确检查自己的代码。感谢您的回应。所以…话虽如此…也许抑制通过测试的输出

  • 如何使用GoogleChrome的postman插件使用POST将FormData()对象发送到webapi。FormData()对象具有附加到其上的表单字段个人ID和MessageBody。我尝试过这样的东西,但没有用:

  • 我有一个类需要进行单元测试: 我有一个测试用例: 当我运行测试用例时,没有使用ActiveMQConnectionFactory的模拟对象。相反,正在使用实际的实现,并且正在建立TCP连接: 我尝试了Powermockito和Mockito,但都失败了。如何模拟对象,如何成功运行测试用例? 我是单元测试新手,试图从各个社区获得帮助,但没有找到合适的答案。任何帮助都将不胜感激。谢谢

  • 问题内容: 当我使用命令:mvn test时,maven使用主要资源而不是src / test / resources中的测试资源。 我如何才能使Maven使用测试资源而不是主要资源? 编辑:我使用Classloader查找我的资源。Classloader可以从我的src / test / resources目录中找到资源,但是它首先在src / main / java中查找该资源。 还是在运行将

  • 问题内容: 我正在GoLang中为一个简单的REST服务编写测试。但是,因为我使用julienschmidt / httprouter 作为路由库。我正在努力编写测试。 main.go 控制器 我的问题是:当GetBook既不是HttpHandler也不是HttpHandle时如何测试呢? 如果我使用传统的处理程序,这样的测试将很容易 问题是,httprouter不是处理程序,也不是handlef

  • 全部: 我对Jasmine测试非常陌生,我想知道的一个关于异步测试的问题是: 有谁能简单解释一下Jasmine是如何知道里面有一个done()函数调用并等待它完成的? 例如,如果我把一些异步调用在之前: Jasmine怎么知道它应该让规范测试等待? 谢谢

  • 我有一个创建标准ubuntu容器的基本DockerFile。我将如何配置ansible主机以便针对docker容器运行它?另外,我怀疑我需要“运行”docker容器以允许ansible连接到它。

  • 我想在@DataMongoTest中使用。我不能在@ContextConfiguration中添加它,因为它是一个接口。 我最后做了以下几件事: 这是可行的,但是我不喜欢我需要设置基本包的这个String值的事实。有趣的是,仅靠是行不通的。 在单元测试中是否有另一种方法来实例化?