我试图模拟一个有嵌套类的类。那个嵌套类有一个构造函数参数。当我试图使用mockito而不是mockito测试时,实际的方法正在执行。
我在外部类上做了@injectmock,在内部类上做了@Mock。
//Actual Class to test using Mockito.
public class ClassA {
public void initMethod(String s1, String s2, String s3, String s4) throws Exception {
ClassB objB = null;
if (objB == null && s3 != null && s4 != null && s2 != null) {
SampleUtil.KeyStorePasswordPair pair = SampleUtil.getKeyStorePasswordPair(s3, s4);
objB = new ClassB(s1, s2, pair.keyStore, pair.keyPassword);
try {
objB.meth1(); //Note: meth1 and meth2 are void methods.
objB.meth2(); // These two methods only to be accessed. something like doNothing
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
我像往常一样尝试使用@Mock调用类,但是实际的方法eth1()正在被访问。
//Somthing which I tried
@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {
@InjectMocks
ClassA classA;
@Mock
ClassB classB;
@Before
public void initMocks() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testInitClient() throws Exception {
// Setup
// Run the test
classA.initMethod("Lorem", "Ipsum", "TestStr1", "TestStr2");
doNothing().when(classB).meth1(); // This is the line need to be mocked. But instead calling the actual method and executing
// Verify the results
}
需要模拟内部ClassB方法,而不是访问真实方法。
作为mockito的初学者,我试图澄清这一点。但在访问void方法等几点上感到困惑,所以无法使用。使用参数等访问构造函数。,
我认为如果没有某种依赖注入,这是不可能的。
在这里,我修改了你的代码,这样它就可以按照你想要的方式运行。
public class ClassA {
// Needed so that it can be replaced with setter
private ClassB objB;
// Extract the generation of ClassB so that it can be prevented
public void generateClassB(String s1, String s2) {
this.objB = new ClassB(s1, s2);
}
public void initMethod(String s1, String s2, String s3, String s4) {
objB = null;
if (s3 != null && s4 != null && s2 != null) {
SampleUtil.KeyStorePasswordPair pair = SampleUtil.getKeyStorePasswordPair(s3, s4);
generateClassB(s1, s2);
try {
objB.meth1(); //Note: meth1 and meth2 are void methods.
objB.meth2(); // These two methods only to be accessed. something like doNothing
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void setClassB(ClassB classB) {
this.objB = classB;
}
}
这是我用来测试结果的ClassB的实现。
public class ClassB {
private String s1;
private String s2;
public ClassB(String s1, String s2) {
this.s1 = s1;
this.s2 = s2;
}
public void meth1() {
System.out.println(s1);
}
public void meth2() {
System.out.println(s2);
}
}
还有测试文件
@RunWith(MockitoJUnitRunner.class)
public class DemoApplicationTests {
private ClassA classA;
private ClassB classB;
@Test
public void testInitClient() {
classA = Mockito.spy(ClassA.class);
classB = Mockito.spy(new ClassB("a", "b"));
Mockito.doNothing()
.when(classB)
.meth1();
// This will replace the ClassA#generateClassB method call with the setter
Mockito.doAnswer(args -> {
classA.setClassB(classB);
return null;
}).when(classA).generateClassB(Mockito.any(), Mockito.any());
classA.initMethod("a", "b", "c", "d");
}
}
另一种更干净的解决方案是将ClassB实例传递给ClassA#initMethod。
问题内容: 我的课如下: 在构造函数中的逻辑和是我试图嘲弄的事情。我想要任何调用:返回一个虚拟字符串。 我试过了: 但这似乎不起作用。仍在执行构造函数逻辑,而不是获取的模拟对象。 问题答案: 您发布的代码适用于最新版本的Mockito和Powermockito。也许您还没有准备A?试试这个: A.java MockA.java 两项测试均应通过Mockito 1.9.0,powermockito
考虑下面给出的代码: 我正在尝试编写一个单元测试用例: < li >调用< code >对象b。B()必须被嘲笑 < li >必须模拟对构造函数的调用 这就是我使用Mockito和Powermockito所做的: 第一个模拟成功工作,但第二个模拟使用 失败,并出现以下错误: org.powermock.reflect.exceptions.ConstructorNotFoundException:
嗨,我有一个问题。我想用espresso为Ui编写android测试,为了让测试不是乱七八糟的,我想嘲弄一下我的演示者。 我在应用程序里用匕首。我的配置如下: 我有组件的模块 那么我也有一个用于活动的组件和一个用于组件的模块 那么我的页面就有了子组件 和子组件的模块 然后详细信息activity注入DetailPresenter 然后是使用构造函数注入的presenter 现在在测试中,我要做的是
我正在为我的java类编写测试类。我将Junit5与Mockito一起使用。 我使用的Junit5与Power Mockito不兼容,所以我只使用Mockito。 我有,它具有下面这样的函数,并且在构造函数中初始化了。 当我编写测试用例时,我模拟了,但是由于我们在一个方法中创建,我如何模拟,这样我就可以编写期望值,根据我在测试类中设置的选择获得值?
我有以下课程布局: 我正在为服务创建一个单元测试,但我想将ServiceHelper用作一个“活动”类,但要模拟ServiceHelper中的构造函数参数。有没有办法通过Mockito实现这一点?
我是莫基托的新手。假设我有一节这样的课 我正在使用Mockito编写一个JUnit测试,我正在使用构造函数创建类的对象。当我安装类时,是否可以模拟Drew()方法?