java - 在 Spring 应用程序中运行测试时的 NPE(JUnit 5、Mockito 3、Spring JPA 存储库)
问题描述
我正在使用 Mockito 3.1.0 和 Junit 5.5.2 运行一个基本的 Spring 应用程序。我有一个包含两个 Spring Data JPA 存储库的服务调用。这些被传递到 DI 的构造函数中(以及另外两个无关紧要的 - 我将它们包括在内,以防它们也可能导致错误。)当应用程序运行时,我发现服务没有问题。
当我运行测试时,我得到了myService
. 单步执行堆栈跟踪,并没有真正向我展示与错误相关的任何内容。我也尝试过(在这篇文章之后:https ://www.baeldung.com/mockito-junit-5-extension )更新我的测试类看起来像这样:
@ExtendWith(MockitoExtension.class)
@RunWith(JUnitPlatform.class) // This dependency doesn't seem to exist
public class MyServiceTest {
// ...
@BeforeEach
// not the JUnit4 @Before annotation.
// Interestingly, this gives me NPEs for the repositories, not the service.
public void setup(){
// ...
}
}
无济于事。我怀疑正在发生的事情是我的设置没有正确连接——无论是作为依赖项还是 DI 的语法。
我该如何调试?我错过了什么?提前致谢!
服务:
import org.springframework.stereotype.Service;
@Service
public class MyService {
private final Repository1 repository1;
private final Repository2 repository2;
private final Repository3 repository3;
private final Repository4 repository4;
public MyService(Repository1 repository1,
Repository2 repository2,
Repository3 repository3,
Repository4 repository4) {
this.repository1 = repository1;
this.repository2 = repository2;
this.repository3 = repository3;
this.repository4 = repository4;
}
public Boolean computeValue(String someInput) {
// does computations with repository1, repository2.
}
}
测试:
import static org.mockito.Mockito.when;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class MyServiceTest {
@Mock
private Repository1 repository1;
@Mock
private Repository2 repository2;
@Mock
private Repository3 repository3;
@Mock
private Repository4 repository4;
@InjectMocks
private MyService myService;
@Before
public void setup {
when(repository1.findAll()).thenReturn(new ArrayList<>());
when(repository1.findAllByInput(anyString())).thenReturn(new ArrayList<>());
// Yes; I'm aware that this could also be a call to
// MockitoAnnotations.initMocks(this). I've tried it:
// it doesn't work. Also, I've intentionally not taken this
// approach due to reasons:
// - https://stackoverflow.com/questions/10806345/runwithmockitojunitrunner-class-vs-mockitoannotations-initmocksthis
}
@Test
void callMyService() {
assertTrue(myService.computeValue("123"));
}
}
样本库:
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
// This is just an example, but this pattern is repeated against all
// repositories in the project.
@Repository
public interface Repository1 extends JpaRepository<Repository1, String> {
}
编辑:
- 我忘了提到我在这个项目中有其他文件正在使用这些没有失败的注释(
@RunWith(MockitoJUnitRunner.class)
,@Mock
,@InjectMocks
, )。@Before
- 我使用相关导入更新了文件,并添加了
RepositoryN
. - 我更新了
MyService
类以更好地反映参数。
解决方案
对于将来遇到此问题的任何其他人,我们能够通过更改其中一个导入来解决此问题:
import org.junit.jupiter.api.Test;
到
import org.junit.Test;
编辑:
- 这与 JUnit 的不同版本有关。关于为什么在这里有一个很好的长篇解释。
推荐阅读
- typescript - 错误 TS2688:找不到“koa”的类型定义文件。1 ///
- c++ - 对地图中的唯一值进行排序
> - regex - 正则表达式 - 如何从结果集中排除某些字符串?
- reactjs - Draft-js-export-html 导出时不包含视频
- java - 如何在运行时更新 pom 中的 maven 依赖项
- javascript - Google Script Editor Script 将昨天的电子邮件提升为前一天的电子邮件
- java - 如何使用功能接口/lambda 参数模拟 void 方法?
- node.js - 如何使用node js从数组中的body解析器获取数据?
- c++ - 如何获取cmake在android中生成.so或.a文件的路径?
- haskell - 如何获取出现在布尔表达式中的变量列表?