我正在尝试测试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;
}
这也解释了为什么我在每个测试用例之前创建资源扩展。
2条答案
按热度按时间f8rj6qna1#
最后,我没有使用mock,而是创建了从具体类扩展而来的stub。
例如,对于
ApplicationConfig
,我创建了ApplicationConfigStub
:对于
MyAppConfig
,我创建了MyAppConfigStub
:然后,我在测试类中初始化
ResourceExtension
时使用了这些存根:这将允许在声明时初始化资源扩展,即使在初始化过程中我们正在调用其他依赖项中的方法。
js81xvg62#
这可能不是这个答案的解决方案,但是我有一个类似的例外,在Vintage JUnit中运行扩展,而不是在ExtendWith注解所需的Jupiter中运行扩展。也许这可以保存一两个小时。
空指针异常:
作品: