Java 在注入其他mock时,是否可以将mock作为参数?
我正在使用JUnit5 我有以下情况:Java 在注入其他mock时,是否可以将mock作为参数?,java,unit-testing,mockito,Java,Unit Testing,Mockito,我正在使用JUnit5 我有以下情况: import org.junit.jupiter.api.beforeach; 导入org.junit.jupiter.api.extension.extensedWith; 导入org.mockito.InjectMocks; 导入org.mockito.Mock; 导入org.mockito.MockedStatic; 导入org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoEx
import org.junit.jupiter.api.beforeach;
导入org.junit.jupiter.api.extension.extensedWith;
导入org.mockito.InjectMocks;
导入org.mockito.Mock;
导入org.mockito.MockedStatic;
导入org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
公共类测试{
//需要嘲笑,但不需要注射
@嘲弄
私人实体管理者实体管理者;
//需要被嘲笑和注射
@嘲弄
私人某某某某某某;
@注射模拟
private SomeClass SomeClass=new SomeClass(entityManager);
公共类SomeClass{
实体管理器实体管理器;
公共类(EntityManager EntityManager){
if(entityManager==null){
抛出新的NullpointerException(“Manager为null”);
}否则{
this.entityManager=entityManager;
}
问题是:
- 需要模拟EntityManager对象来创建我要测试的类
- 必须注入SomeClass中所需的SomeDao
- 我得到一个空指针,因为当我将模拟对象作为参数提供给构造函数时,它似乎没有被创建
有人知道如何解决这个问题吗?我可以创建一个无参数构造函数,但这会给我一个构造函数,我只需要它来进行测试,它不是很“干净”。你应该将你的SomeDao SomeDao作为参数添加到SomeClass构造函数中,然后你就可以使用@Mock通过测试来操作它了。你应该这样添加你的SomeDaomeDao作为SomeClass构造函数的参数,然后您将能够通过@Mock的测试操作它查看这个答案()Mockito使用了3种方法来注入一个Mock。 第一个是在构造函数中注入它,如果有一个构造函数接受参数 因此,我更改了我的构造函数@nesmeyana提到:
import org.junit.jupiter.api.Test;
导入org.junit.jupiter.api.extension.extensedWith;
导入org.mockito.InjectMocks;
导入org.mockito.Mock;
导入org.mockito.junit.jupiter.MockitoExtension;
导入javax.persistence.EntityManager;
导入静态org.junit.jupiter.api.Assertions.assertEquals;
导入静态org.mockito.mockito.when;
@ExtendWith(MockitoExtension.class)
公共类测试{
@嘲弄
私有实体管理器mockentimanager;
@嘲弄
私有的SomeDao mockSomeDao;
@注射模拟
私人某类某类;
@试验
公开无效测试(){
when(mockSomeDao.duck()),然后return(10);
assertEquals(10,someClass.bla());
}
}
公共类SomeClass{
实体管理器实体管理器;
SomeDao SomeDao;
公共SomeClass(EntityManager EntityManager,SomeDao SomeDao){
if(entityManager==null){
抛出新的NullpointerException(“Manager为null”);
}否则{
this.entityManager=entityManager;
this.someDao=someDao;
}
公共类SomeDao{
int x=5;
公共SomeDao(int x){
这个.x=x;
}
公共int duck(){
返回x;
}
}
但是,由于我必须修改代码才能测试我的类,所以我不得不重新考虑我的代码编写!
我和所有读过这篇文章的人都应该避免硬依赖,并使用CI(依赖注入)来轻松测试他们的代码。看看这个答案()Mockito使用了3种方法来注入模拟。
第一个是在构造函数中注入它,如果有一个构造函数接受参数
因此,我更改了我的构造函数@nesmeyana提到:
import org.junit.jupiter.api.Test;
导入org.junit.jupiter.api.extension.extensedWith;
导入org.mockito.InjectMocks;
导入org.mockito.Mock;
导入org.mockito.junit.jupiter.MockitoExtension;
导入javax.persistence.EntityManager;
导入静态org.junit.jupiter.api.Assertions.assertEquals;
导入静态org.mockito.mockito.when;
@ExtendWith(MockitoExtension.class)
公共类测试{
@嘲弄
私有实体管理器mockentimanager;
@嘲弄
私有的SomeDao mockSomeDao;
@注射模拟
私人某类某类;
@试验
公开无效测试(){
when(mockSomeDao.duck()),然后return(10);
assertEquals(10,someClass.bla());
}
}
公共类SomeClass{
实体管理器实体管理器;
SomeDao SomeDao;
公共SomeClass(EntityManager EntityManager,SomeDao SomeDao){
if(entityManager==null){
抛出新的NullpointerException(“Manager为null”);
}否则{
this.entityManager=entityManager;
this.someDao=someDao;
}
公共类SomeDao{
int x=5;
公共SomeDao(int x){
这个.x=x;
}
公共int duck(){
返回x;
}
}
但是,由于我必须修改代码才能测试我的类,所以我不得不重新考虑我的代码编写!
我和所有读过这篇文章的人都应该避免硬依赖,并使用CI(依赖注入)来轻松测试他们的代码。我添加了使用过的导入,您建议的是JUnit4的一部分,我使用的是JUnit5(应该提到这一点)试试我的编辑;)应该给你想要的。我添加了使用过的导入,你建议的是JUnit4的一部分,我使用的是JUnit5(应该提到)试试我的编辑;)应该给你想要的。Drop
new someClass(entityManager)
initialization.2.添加somedao作为构造函数参数。1.Dropnew someClass(entityManager)
initialization.2.添加somedao作为构造函数参数。