JMockit:同一测试中的@Mocke和MockUp组合

时间:2013-09-12 16:30:27

标签: jmockit spring-test-mvc

我必须做什么:

我必须用JMockit测试我的spring mvc。我需要做两件事:

  1. 重新定义 MyService.doService 方法
  2. 检查重新定义 MyService.doService 方法的次数
  3. 问题:

    为了应对第一项,我应该使用MockUp ;为了应对我应该使用@Mocked MyService 的第二项。据我所知这两种方法相互重叠

    我的问题:

    1. 如何覆盖MyService.doService方法并同时检查调用它的次数?
    2. 是否可以避免混合行为和在我的情况下基于状态的测试方法?
    3. 我的代码:

      @WebAppConfiguration
      @ContextConfiguration(locations = "classpath:ctx/persistenceContextTest.xml")
      @RunWith(SpringJUnit4ClassRunner.class)
      public class MyControllerTest extends AbstractContextControllerTests {
      
          private MockMvc mockMvc;
      
          @Autowired
          protected WebApplicationContext wac;
      
          @Mocked()
          private MyServiceImpl myServiceMock;
      
          @BeforeClass
          public static void beforeClass() {
      
             new MockUp<MyServiceImpl>() {
                  @SuppressWarnings("unused")
                  @Mock
                  public List<Object> doService() {
                      return null;
                  }
              };
          }
      
          @Before
          public void setUp() throws Exception {
              this.mockMvc = webAppContextSetup(this.wac).build();
          }
      
          @Test
          public void sendRedirect() throws Exception {
              mockMvc.perform(get("/doService.html"))
                      .andExpect(model().attribute("positions", null));
      
              new Verifications() {
                  {
                      myServiceMock.doService();
                      times = 1;
                  }
              };
          }
      }
      

1 个答案:

答案 0 :(得分:2)

我不知道是什么让您觉得“应该使用”MockUp用于某些事情,而在同一测试中使用@Mocked代替其他内容。

实际上,您可以使用这两种API中的任何一种,因为它们都非常强大。但是,通常情况下,在给定的测试(或测试类)中只使用一个或另一个,

要验证给定模拟方法发生了多少次调用,可以在使用@Mock时使用MockUp注释的“invocations / minInvocations / maxInvocations”属性;或者使用@Mocked时的“times / minTimes / maxTimes”字段。选择最符合您需求和测试风格的产品。例如,测试,请查看JMockit文档。