我一直试图模仿我的服务/业务类来开始测试我的应用程序,但有许多对其他类的“依赖”,主要是存储库和传递给这些存储库的存根。为了能够对我的服务进行单元测试,我一直试图设置它,但我不断地得到错误,我真的不知道我的设置是否正确:
我没有包括接口,因为我觉得没有必要,但如果需要,可以。
public abstract class DemoRepo<T> implements Repository<T> {
private dbStub stub;
private Class<T> clazz;
public DemoRepo(DbStub stub,Class<T> clazz){
this.clazz = clazz;
this.stub = stub;
}
@Override
public void add(T item) {
stub.inSert(item);
}
@Override
public void update(T item) {
stub.update(item);
}
...
}
public class Class1Repo extends DemoRepo<Class1> {
public Class1Repo(DbStub stub) {
super(stub,Class1.class);
}
}
public class Class2Repo extends DemoRepo<Class2> {
public Class2Repo(DbStub stub) {
super(stub,Class2.class);
}
}
public abstract class AbstractService implements ClassService {
private Repository<Class1> class1Repository;
private Repository<Class2> class2Repository;
public AbstractService(Repository<Class1> class1Repository, Repository<Class2> class2Repository) {
this.class1Repository = class1Repository;
this.class2Repository = class2Repository;
}
public boolean itemValiation(String itemId){
Class1 item = class1Repository.findOne(itemId);
item.setValidated(true);
class1Repository.update(item);
return true;
}
.....
}
public class DemoImplService extends AbstractService {
public DemoImplService(Class1Repo c1repo,Class2Repo c2repo){
super(c1repo, c2repo);
}
}
但正如您所看到的,我需要传递2个模拟存储库,它们自己是从一个模拟的“存根”实例化的,这就是我的问题。
我尝试过许多不同的方法,但最近的一种方法给我带来了麻烦:
class DemoImplServiceTest {
@Mock
private DbStub stub;
private DemoImplService service;
@InjectMocks
private Class1Repo repo;
@InjectMocks
private Class2Repo repor;
@Before
public void setUp() {
MockitoAnnotations.initMocks( this );
Class1Repo repo = new Class1Repo(stub);
Class2Repo repor = new Class2Repo(stub);
DemoImplService service = new DemoImplService(repo,repor);
}
@Test
void itemValiation() {
Class1 c1 = new Class1();
**when (repo.findOne("1")).thenReturn(c1);**
//java.lang.NullPointerException
}
}
我的逻辑是尝试使用mock/injectmocks机制,然后只是模拟存储库,因为我不需要模拟存根,但它没有编译,我得到的是java.lang.NullPointerException
新班级
class DemoImplServiceTest {
@Mock
private Class1Repo repo;
@Mock
private Class2Repo repor;
@InjectMocks
private DemoImplService service;
@Before
public void setUp() {
MockitoAnnotations.initMocks( this );
Class1 object = new Class1();
when (repo.findOne("1")).thenReturn(object);
}
@Test
void itemValiation() {
boolean updated = service.itemValiation("1");
assertTrue( updated );
verify( repo ).findOne("1");
ArgumentCaptor<Class1> class1Captor = ArgumentCaptor.forClass( Class1.class );
verify( repo ).update( class1Captor.capture() );
Class1 updatedCclass1 = class1Captor.getValue();
assertTrue( Class1.isValidated() );
}
这一行boolean updated=service.itemvaliation(“1”);
就是failling:java.lang.NullPointerException
我试着声明
Class1 object = new Class1();
when (repo.findOne("1")).thenReturn(object);
java.lang.NullPointerException
at com.jd.mypackage.test.services.ImplServiceTest.itemValiation(ImplServiceTest.java:187)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:316)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:114)
at org.junit.jupiter.engine.descriptor.MethodTestDescriptor.lambda$invokeTestMethod$6(MethodTestDescriptor.java:171)
at org.junit.jupiter.engine.descriptor.MethodTestDescriptor$$Lambda$141/655381473.execute(Unknown Source)
at org.junit.jupiter.engine.execution.ThrowableCollector.execute(ThrowableCollector.java:40)
at org.junit.jupiter.engine.descriptor.MethodTestDescriptor.invokeTestMethod(MethodTestDescriptor.java:168)
at org.junit.jupiter.engine.descriptor.MethodTestDescriptor.execute(MethodTestDescriptor.java:115)
at org.junit.jupiter.engine.descriptor.MethodTestDescriptor.execute(MethodTestDescriptor.java:57)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute$1(HierarchicalTestExecutor.java:81)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$$Lambda$109/981661423.execute(Unknown Source)
at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:76)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute$1(HierarchicalTestExecutor.java:91)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$$Lambda$109/981661423.execute(Unknown Source)
at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:76)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute$1(HierarchicalTestExecutor.java:91)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$$Lambda$109/981661423.execute(Unknown Source)
at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:76)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:51)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:43)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:137)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:87)
at org.junit.platform.launcher.Launcher.execute(Launcher.java:93)
at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:61)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
我认为您应该在要测试的类上使用@injectmocks,并在该类的依赖项上使用@mock。
class DemoImplServiceTest {
@InjectMocks
private DemoImplService service;
@Mock
private Class1Repo repo;
@Mock
private Class2Repo repor;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
void testMethod() {
...
...
}
}
我正在为我的java类编写测试类。我将Junit5与Mockito一起使用。 我使用的Junit5与Power Mockito不兼容,所以我只使用Mockito。 我有,它具有下面这样的函数,并且在构造函数中初始化了。 当我编写测试用例时,我模拟了,但是由于我们在一个方法中创建,我如何模拟,这样我就可以编写期望值,根据我在测试类中设置的选择获得值?
问题内容: 我想将构造函数模拟为方法。 在我的测试中,我想做这样的事情: 但是给我这个 错误 知道为什么吗? 问题答案: 您可以使用PowerMock模拟构造函数。 如果由于某种原因而无法使用PowerMock,则最可行的解决方案是将工厂注入到包含此方法的任何类中。然后,您将使用工厂创建对象并模拟工厂。
我是莫基托的新手。假设我有一节这样的课 我正在使用Mockito编写一个JUnit测试,我正在使用构造函数创建类的对象。当我安装类时,是否可以模拟Drew()方法?
我有一个带有私有构造函数的单例类,我想为此编写单元测试。 如何使用mockito框架模拟具有私有构造函数的类。 谢谢
问题内容: 我试图在此模块中找到一种模拟Redis的方法: 使用以下测试代码: 我还尝试了一些变体,但由于基本需要模拟构造函数,因此我有点受阻,我不确定Sinon是否支持这一点? 不知道在这里还有什么尝试,我也尝试按照这里的建议使用rewire,但是从不设置该私有变量。 我想最终伪造我的错误路径。 我很想听听其他人在测试Node js中的Redis所做的事情。 问题答案: 您的问题不是Sinon是