繁体   English   中英

java.lang.NullPointerException 在 io.dropwizard.testing.junit5.DropwizardExtensionsSupport.beforeEach

[英]java.lang.NullPointerException at io.dropwizard.testing.junit5.DropwizardExtensionsSupport.beforeEach

我正在尝试测试 Dropwizard 资源。

我的测试如下所示:

@ExtendWith(DropwizardExtensionsSupport.class)
public class CommonObjectsTest {
    private ResourceExtension EXT;

    @BeforeEach
    public void setup() {
        ApplicationConfig applicationConfig = mock(ApplicationConfig.class);
        when(applicationConfig.getYears()).thenReturn(1);

        MyAppConfig myAppConfig = mock(MyAppConfig.class);
        when(myAppConfig.getAppConfig()).thenReturn(applicationConfig);

        EmailClient emailClient = mock(EmailClient.class);
        CommonObjects commonObjects = new CommonObjects(myAppConfig, emailClient);

        EXT = ResourceExtension.builder()
                .addResource(commonObjects)
                .build();
    }

    @Test
    public void getYearsSuccessfully() {
        Response response = EXT.target("/get_years").request().get();
        System.out.println(response);
    }
}

但是,这会给出错误消息:

java.lang.NullPointerException
    at io.dropwizard.testing.junit5.DropwizardExtensionsSupport.beforeEach(DropwizardExtensionsSupport.java:123)
    at io.dropwizard.testing.junit5.DropwizardExtensionsSupport.beforeEach(DropwizardExtensionsSupport.java:106)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeBeforeEachCallbacks$1(TestMethodTestDescriptor.java:159)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeBeforeMethodsOrCallbacksUntilExceptionOccurs$5(TestMethodTestDescriptor.java:195)
    ...

坦率地说,这是没有信息的。 有人可以指出这里有什么问题吗?

P/S 这是CommonObjects构造函数:

    public CommonObjects(MyAppConfig configuration, EmailClient emailClient) {
        ApplicationConfig appConfig = configuration.getAppConfig();
        this.years = appConfig.getYears();
        this.emailClient = emailClient;
    }

这也解释了为什么我在每个测试用例之前创建资源扩展。

最后,我没有使用模拟,而是创建了从具体类扩展的存根。

例如,对于ApplicationConfig ,我创建了ApplicationConfigStub

public class ApplicationConfigStub extends ApplicationConfig {
    @Override
    public int getYears() {
        return 1;
    }
}

对于MyAppConfig ,我创建了MyAppConfigStub

public class MyAppConfigStub extends MyAppConfig {
    @Override
    public ApplicationConfig getAppConfig() {
        return new ApplicationConfigStub();
    }
}

然后,我在测试 class 中初始化ResourceExtension时使用了这些存根:

private static final EmailClient emailClient = mock(EmailClient.class);
private static final ResourceExtension EXT = ResourceExtension.builder()
            .addResource(new CommonObjects(new MyAppConfigStub(), emailClient))
            .build();

这将允许在声明时初始化资源扩展,即使我们在初始化期间调用其他依赖项中的方法。

这可能不是这个答案的解决方案,但是我有一个类似的例外,即在老式 JUnit 而不是 ExtendWith 注释所需的 Jupiter 中运行扩展的愚蠢问题。 也许这会为某人节省一两个小时。

空指针异常:

import org.junit.Test;

作品:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM