【问题标题】:Unit Testing with Jersey Rest Test Framework and Mockito使用 Jersey Rest 测试框架和 Mockito 进行单元测试
【发布时间】:2023-03-28 00:30:02
【问题描述】:

有人可以帮我解决这个问题吗? 我正在使用 Jersey REST 测试框架版本 2.21 为 Rest 资源编写单元测试。(在 Grizzly 容器上)。

当我调试测试类时,我看到了 myManager 的模拟对象。但是当调试进入我的“MyResouce 类时,myManager 对象变为 null 并出现 NullPointer 异常。

尝试过不同人给出的解决方案,但没有运气。有人可以帮助我吗?从近三天开始就有这个问题。 :(

我的资源类是这样的。

@Component
@Path("/somepath")
public class MyResource {
    @Autowired
    private MyManager myManager;

    @Path("/somepath")
    @GET
    @Produces("application/json")
    @ResponseType(String.class)
    public Response getResults(@QueryParam("queryParam") String number) {
        // myManager is an interface
        String str = myManager.getResult(number);
    }
}

这是我的测试类

public class MyResourceTest extends JerseyTest {
    @Mock
    private MyManager myManager;

    @InjectMocks
    private MyResource myResource;

    @Override
    protected Application configure() {
        MockitoAnnotations.initMocks(this);
        return new ResourceConfig().register(MyResource.class)
                .register(new AbstractBinder() {
                    @Override
                    protected void configure() {
                        bind(myManager).to(MyManager.class);
                    }
                });
    }

    @Test
    public void getResultsTest() {
        when(myManager.getResult(anyString())).thenReturn(mock(String.class));
        String str = target("path").queryParam("queryParam","10").request().get(String.class);
    }
}

【问题讨论】:

  • MyResource 里面有 MyManager,那个对象是 null 对吧?
  • 感谢您的回复。是的你是对的。模拟对象在 MyResource 类中变为空。顺便说一句,我正在使用 Mockito 和 @Mocked 注释不可用。

标签: java rest unit-testing jersey jersey-test-framework


【解决方案1】:

您正在使用 Spring(注入)注释,因此将从 spring 上下文中查找服务。这就是它为 null 的原因,因为您还没有在 spring 上下文中设置模拟。

最好的办法是使用构造函数注入(而不是字段注入)。这使得测试更容易

@Path(..)
public class MyResource {
    private final MyManager manager;

    @Autowired
    public MyResource(MyManager manager) {
        this.manager = manager;
    }
}

然后在你的测试中

return new ResourceConfig()
    .register(new MyResource(myManager));

【讨论】:

  • 非常感谢您的回复。我按照您的建议进行了更改,现在可以在 MyResource 类中获取模拟对象。与 MyManager 类类似,我在 MyResource 类中也有其他类。我是否应该仅通过 Constructor 构造它们。很抱歉再次问你。仅出于测试用例的目的,我必须包含这些构造函数。有没有其他方法可以做到这一点。
  • 你好@Vijaya请点击右边的勾号,如果这个答案对你有帮助。 (y)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-04
  • 2017-09-19
相关资源
最近更新 更多