@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。想知道这是否可行。查看了同一主题的所有相关问题,但找不到任何相关问题。这是Mockito的限制吗?
答案 0 :(得分:1)
您无法模拟方法本地的对象。您只能模拟类级别对象。 看看你分享的代码片段,我建议不需要对方法method1进行单元测试(因为它只是调用其他方法,这里没有涉及条件或循环)。单元测试" makeHTTPCallAndConvertResponseToJSONString" ClassB的方法
答案 1 :(得分:1)
我认为你不能模拟使用'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方法并从这个方法返回你的模拟对象。
答案 2 :(得分:0)
您需要从本地对象将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
}
}