小编Pot*_*ipz的帖子

在我的应用中查找所有泽西岛资源方法的列表?

Jersey是否提供任何方式来列出它所暴露的所有资源?也就是说,给定资源类:

package com.zoo.resource

@Path("/animals")
public class AnimalResource {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("dog")
    public Dog getDog(){
    ...
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("cat")
    public Cat getCat(){
    ...
    }
}
Run Code Online (Sandbox Code Playgroud)

泽西岛是否为我提供了获取信息的方式:

  • GET在路径/animals/dog返回类型Dog
  • GET在路径/animals/cat返回类型Cat

(此外,它是否为我提供了一种了解AnimalResource是资源的方法?)

我希望在单元测试中可以获得这些信息,以便我可以检查我公开的每个资源是否符合外部系统的预期.我知道有一个自动化暴露了application.wadl,但是我没有看到向我显示返回类型,我不知道如何从我的测试中访问它.

java reflection rest jax-rs jersey

8
推荐指数
1
解决办法
7507
查看次数

何时记录链式异常?

我是一个绿色开发人员,试图在大型多层java应用程序中处理错误处理(har-har).在很多情况下,我认为通过多个层次链接异常是一个好主意; 例如,当呼叫最低层的某些外部服务失败时,视图中会出现问题:

  • 请求内容X,但未授权用户
    • 引起:授权用户列表为空
      • 引起:用户管理webservice响应错误请求 - 参数foo必须格式化为'xyz'

最重要的例外,我真正想要检查的栈跟踪,是链中的最后一个; 我提出了一个错误的请求,我需要修复foo的格式.但是当我让这个异常在层中冒泡时,很好地链接在对每个层都有意义的异常中...当我最终捕获并记录该事物时,默认的日志记录行为总是向我显示关于最外层异常的详细信息,以及可能是根本原因的5行堆栈跟踪.

这使得我希望在异常发生时记录它们,然后让它们冒泡,但最后你会记录大多数事情两次; 什么时候发生,什么时候最终被抓住

这里的最佳做法是什么?

java error-handling logging exception

6
推荐指数
1
解决办法
498
查看次数

使用maven-jaxb2-plugin生成java源时,如何为集合启用setter?

我正在使用maven-jab2-plugin从XSD架构生成POJO.我生成的类没有任何集合的字段的setter.如何为集合生成setter?

任何人都可以解释默认情况下不启用setter的原因吗?

java xjc maven-jaxb2-plugin

6
推荐指数
1
解决办法
6375
查看次数

在 Mockito 中重用模拟行为/最佳实践?

我将以我非常新的背景作为序言,一般没有太多的测试经验,以前从未使用过模拟框架。

我正在为访问许多不同 Web 服务的代码编写单元测试,我对此进行了嘲笑。我的许多测试验证了一个调用的结果,其中除了对 ServiceX 的调用之外,我的所有服务调用都成功。我的第一直觉是为@Before 块中的所有模拟设置happy-path 行为,然后为每个测试修改模拟行为。

@Before
public void init(){
    when(serviceA.doSomething()).thenReturn(true);
    when(serviceB.doSomething()).thenReturn(true);
    when(serviceC.doSomething()).thenReturn(true);
    when(serviceD.doSomething()).thenReturn(true);
    when(serviceE.doSomething()).thenReturn(true);
}

@Test
public void testDoBusinessSuccess(){
    String result = businessLogic.doBusiness();
    assertThat(result, is("success"));
}

@Test
public void testDoBusinessFailureWhenServiceAFails(){
    when(serviceA.doSomething()).thenReturn(false);

    String result = businessLogic.doBusiness();
    assertThat(result, is("service A is down!"));
}

@Test
public void testDoBusinessFailureWhenServiceBFails(){
    when(serviceB.doSomething()).thenReturn(false);

...
Run Code Online (Sandbox Code Playgroud)

这使得每个测试用例都简洁,并且很容易看到正在测试的内容,因为我只指定了偏离规范的行为。

但是我怀疑这不是 Mockito 希望我设置模拟行为的方式,因为当我尝试验证 ServiceB 中的失败意味着 ServiceC 永远不会被命中时,我意识到我when(serviceC.doSomething())在 @Before 中的调用算作对 serviceC 的调用. 也就是说,我verifyZeroInteractions(serviceC)总是失败,因为我调用了when(serviceC.doSomething()).thenReturn(true),即使测试用例从未接触过 serviceC 。

那么最佳实践是什么?我是否最好在每次测试中为每个模拟明确设置行为,即使我会在所有地方重复几乎相同的 5 行?

java unit-testing mockito

5
推荐指数
1
解决办法
3941
查看次数