@Component
Class A{
public String method1(){
ClassB bObject = new ClassB();
bObject.makeHTTPCallAndConvertResponseToJSONString();
}
}
Class ATest{
@InjectMocks
ClassA aObject;
public String testMethod1(){
// how to test aObject.method1();
// I want to mock new bObject that is created
}
}
需要模拟正在创建的 bObject。想知道这是否可能。浏览了同一主题的所有相关问题,但找不到任何问题。这是莫吉托的限制吗?
您不能模拟方法的本地对象。您只能模拟类级别对象。看看你分享的代码段,我建议没有必要对方法method1进行单元测试(因为它只是调用其他方法,这里不涉及条件或循环(。最好对 ClassB 的"makeHTTPCallAndConvertResponseToJSONString"方法进行单元测试
我不认为你可以模拟使用"new"创建的对象 关键字。但是,您可以创建一个公共 getter 方法来创建该对象,然后模拟新方法。
这是一个通用代码供您理解 -
//your method
public void someMethod() {
...
Object object = new Object();
...
}
从另一个公共方法获取新对象。
//new implementation
public void someMethod() {
...
Object object = getObject();
...
}
public Object getObject() {
return new getObject();
}
现在,您可以模拟 getObject 方法并从此方法返回模拟对象。
您需要将bObject
从本地对象转换为类级对象。
然后你可以像下面这样模拟它:
@RunWith(MockitoJUnitRunner.class)
public class ATest {
@Mock
private ClassB bObject;
private ClassA aObject;
@Before
public void setUp() throws IOException {
aObject = new ClassA(bObject);
}
@Test
public String testMethod1(){
String mockedJsonString = "{'sample':'string'}";
when(bObject. makeHTTPCallAndConvertResponseToJSONString()).thenReturn(mockedJsonString);
// Do whatever you want to test and verify
}
}