1

我必须做的:

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

  1. 重新定义MyService.doService方法
  2. 检查重新定义的MyService.doService方法被调用了多少次

什么问题:

为了应付第一项,我应该使用 MockUp;为了应对第二个项目,我应该使用 @Mocked MyService。据我了解,这两种方法相互覆盖

我的问题:

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

我的代码:

@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;
            }
        };
    }
}
4

1 回答 1

2

我不知道是什么给了你这样的印象,即你“应该使用”MockUp某事,而@Mocked在同一个测试中使用其他某事。

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

要验证给定模拟方法发生了多少次调用,您可以在使用;@Mock时使用注释的“invocations/minInvocations/maxInvocations”属性。MockUp或使用@Mocked. 选择最能满足您的需求和测试风格的那个。例如测试,请查看 JMockit 文档。

于 2013-09-13T19:28:14.967 回答