如何在Java中模拟新对象的创建

如何在Java中模拟新对象的创建,java,junit,mockito,Java,Junit,Mockito,下面是要模拟的代码: private MultivaluedMap<String, Object> addAuthorizationAndCorrelationIdHeader(MultivaluedMap<String, Object> httpHeaders) { if(httpHeaders == null) httpHeaders = new MultivaluedHashMap<>(); String tok

下面是要模拟的代码:

private MultivaluedMap<String, Object> addAuthorizationAndCorrelationIdHeader(MultivaluedMap<String, Object> httpHeaders) {
    if(httpHeaders == null)
        httpHeaders = new MultivaluedHashMap<>();

        String token = new JSONWebToken().getUserInfo().getToken("SYSTEM", "JobScheduler");
}
private MultivaluedMap addAuthorizationAndCorrelationIdHeader(MultivaluedMap httpHeaders){
if(httpHeaders==null)
httpHeaders=新的多值hashMap();
String token=new JSONWebToken().getUserInfo().getToken(“系统”、“作业调度器”);
}

如何模拟新的JSONWebToken()部件?

您应该创建某种JSONTokenFactory,如:

public class JSONWebTokenFactory {
    public JSONWebToken creaateWebToken() {
        return new JSONWebToken(); 
    }
}

然后将工厂实例传递给您正在测试的类。现在,您可以在测试中通过JSONTokenFactory的模拟。

您可以使用spy
org.mockito.mockito.spy
。它看起来像这样

@RunWith(MockitoJUnitRunner.class)
class YourTestClass {

@Test
public void yourTestCase() {
    JSONWebToken jwt = spy(new JSONWebToken());
    UserInfo mockUserInfo = mock(UserInfo.class);
    when(jwt.getUserInfo()).thenReturn(mockUserInfo);
}
}
有两种选择:

  • 您可以使用诸如PowerMock或Mockito之类的模拟框架,允许对
    new
  • 您可以避免在生产代码中执行
    新的
    调用。相反,您使用依赖注入;例如,通过使用工厂(如您已经得到的答案),或通过构造函数传入此类对象

  • 长话短说:使用
    new
    会导致代码“难以测试”。真正的答案是学习如何创建可测试的代码;这是一个很好的起点。

    仍然抛出空指针:因为它在这个(新的JSONWebToken().getUserInfo())中得到计算,它返回为空。请确保在类之前添加了
    @RunWith(MockitoJUnitRunner.class)