Mockito 在测试向导资源时始终返回 null



我正在尝试测试dropwizard资源,并按照 http://www.dropwizard.io/manual/testing.html 这样做。

但是,我总是从模拟类/方法中获取一个空对象。

资源方法

    @GET
    @Path("/id")
    @ApiOperation("Find property by id")
    @Produces(MediaType.APPLICATION_JSON)
    public Property findById(@QueryParam("id") int id) {
        return propertyDAO.findById(id);
    }

和测试类

public class PropertiesResourceTest {
    private static final PropertiesDAO dao = mock(PropertiesDAO.class);
    @ClassRule
    public static final ResourceTestRule resources = ResourceTestRule.builder()
            .addResource(new PropertiesResource(dao))
            .build();
    private final Property property = new Property(1);
    @Before
    public void setUp() {
        when(dao.findById(eq(1))).thenReturn(property);
        reset(dao);
    }
    @Test
    public void findById() {
        assertThat(resources.client().target("/properties/id?id=1").request().get(Property.class))
                .isEqualTo(property);
        verify(dao).findById(1);
    }
}

我尝试以多种方式旋转它,但结果总是相同的:

expected:<Property | ID: 1 > but was:<null>

您是否有任何关于为什么 mockito 总是返回空对象的线索?

when(dao.findById(eq(1))).thenReturn(property);
reset(dao);

第一行存根调用findById 。第二行 reset 立即删除该存根。您可能希望交换这两个语句的顺序。

尽管将模拟保留在静态变量中是一种危险的习惯,并且尽管文档建议您手动调用reset是正确的,但在设置期望(即作为@Before方法的第一行)或测试完成后(即作为@After方法的最后一行)之前这样做很重要。否则,Mockito将在那里找不到存根,并将返回其默认值null

我建议遵循他们的建议,删除static修饰符并使用@Rule而不是@ClassRule。它不太可能无意中造成测试污染。

您链接的文档包含按该顺序排列的方法的代码示例,这是非常奇怪的。它可能应该更新。

相关内容

  • 没有找到相关文章

最新更新