JUnit for Spring mvc服务方法void返回类型

时间:2014-01-15 11:08:48

标签: java spring-mvc junit

这是我的服务类

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.integration.Message;
import org.springframework.integration.MessagingException;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.core.MessageHandler;
import org.springframework.stereotype.Service;

@Service
public class EmailService implements MessageHandler {

    @Autowired
    @Qualifier("receiveChannel")
    private DirectChannel messageChannel;

    private final Log logger = LogFactory
            .getLog(EmailService.class);

    public void init() {
        logger.info("initializing...");
        System.out.println("INIT");
        messageChannel.subscribe(this);
    }

    @Override
    public void handleMessage(Message<?> message) throws MessagingException {
         logger.info("Message: " + message);

    }
}

对于init,我想创建一个JUnit测试用例。怎么写?

这是我尝试过的。但它不起作用

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration("classpath:webapptest")
@ContextConfiguration(locations = {"classpath:test-applicationcontext.xml"})
public class EmailServiceTest {

    @Autowired
    private EmailService emailService;

    @Test(timeout=600000)
    public void testEmailService() throws Exception {
        emailService=Mockito.spy(emailService);
        Mockito.doNothing().when(emailService).init();
    }
}

在控制台中,它不会使用init()方法打印记录器或打印语句。

我在做什么错误?如何编写测试用例?

1 个答案:

答案 0 :(得分:1)

在您的测试中,您没有调用init()。如果不调用Mockito.doNothing().when方法,它将不会执行init()。就您的代码而言,init()方法只是一种常规的公共方法。

如果您希望在实例化类之后调用init()方法,则必须使用@PostConstruct注释对其进行注释。

您的测试应该如下所示

@Test(timeout=600000)
public void testEmailService() throws Exception {
.....
        emailService.init();
}

你必须打电话给emailService.init(),因为你已经创建了一个间谍;为了测试工作。目前你没有测试任何东西,只是在你的测试方法中有一堆模拟。 此外,您还可以通过全面测试来验证在测试init方法时是否调用messageChannle.subscribe()方法。 您确实希望通过验证是否调用subscribe()方法来收紧测试。