Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在注入其他mock时,是否可以将mock作为参数?_Java_Unit Testing_Mockito - Fatal编程技术网

Java 在注入其他mock时,是否可以将mock作为参数?

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

我正在使用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(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.Drop
new someClass(entityManager)
initialization.2.添加somedao作为构造函数参数。