我的几次测试都出现了间歇性问题。我和Googling一起做了很多头发,并没有设计出解决方案。
给出以下简化的测试源:
@RunWith(Parameterized.class)
public class JsonValueObjectReaderWriterITTest extends JerseyTest {
@Parameterized.Parameters
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][]{
{ Jackson1JsonValueObjectReaderWriter.class },
{ Jackson2JsonValueObjectReaderWriter.class },
{ GsonJsonValueObjectReaderWriter.class }
});
}
public JsonValueObjectReaderWriterITTest(final Class<?> cls) {
super(new ResourceConfig(cls, JacksonJsonProvider.class, UserResource.class));
}
@Test
public void ensureInvalidEntityConversionReturnsError() throws Exception {
UserV1 user = new UserV1();
user.name = "John Smith";
Response response = target()
.request("application/json")
.post(Entity.entity(user, MediaType.valueOf(UserV1.TYPE_STR+".v1+json")));
assertThat(response.getStatus(), is(400));
assertThat(response.readEntity(String.class), anyOf(
is(equalTo("{\"message\":\"username may not be null\"}")),
is(equalTo("{\"message\":\"email may not be null\"}"))
));
}
@Path("/")
public static class UserResource {
@POST
public Response post(@Valid final UserV1 user) {
assertThat(user.name, is(equalTo("John Smith")));
assertThat(user.username, is(equalTo("john.smith")));
assertThat(user.email, is(equalTo("john.smith@example.com")));
return Response.created(URI.create("/abc123")).build();
}
}
}
任何人都可以指出我正确的方向,为什么我的静态data()
方法中提供的测试提供者无法间歇注册。实际上,我指出了这三个提供者。在任何给定的测试运行期间,零或更多将无法运行。但如果独立测试,它们都可以正常工作。如果需要进一步澄清,请告诉我,我会提供所需的信息。如果可能的话,我宁愿不要混淆这个问题。
提前致谢!
更新
似乎JacksonJsonProvider
偶尔优先于我的提供程序实现,并将空对象传递给控制器。向每个提供程序添加@Priority(Integer.MAX_VALUE)
可以可靠地解决问题,但这样做会感觉很脏,特别是因为这是一个库。是否有任何方法可以覆盖优先级以进行测试,但是否则未指定?