下面是示例代码,如果这项工作我可以在我的业务代码中使用相同的逻辑。
class A{
public String[] getString(String[] a){
System.out.println("called");
return a;
}}
class B{
A a;
public String[] getString(){
String[] ab = {"inside main class"};
a= new A();
return a.getString(ab);
}
}
的Junit:
public class test{
private MockMvc mockMvc;
@Mock
private A a;
@InjectMocks
private B b;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mockMvc = MockMvcBuilders.standaloneSetup(b).build();
}
@Test
public void test2Object(){
String[] bc = {"mock main class"};
Mockito.when(a.getString(Mockito.any(String[].class))).thenReturn(bc);
System.out.println((b.getString())[0]);
}
}
预期o / p"模拟主要课程"但是我正在主要课程中#34;
有谁可以帮我解决这个问题。
答案 0 :(得分:0)
你正在注入一个A模拟但是在B的getString方法中,你正在创建一个新的A实例并对其进行处理。删除它,将调用模拟版本:
class B{
A a;
public String[] getString(){
String[] ab = {"inside main class"};
// a= new A();
return a.getString(ab);
}
public void setA(A a){this.a = a;}
}
我建议添加一个setter,这样在生产中你可以以某种方式注入它。
<强>更新强>
您的测试类应该像:
public class test{
@Mock
private A a;
@InjectMocks
private B b;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void test2Object(){
// Arrange
String[] bc = {"mock main class"};
Mockito.when(a.getString(Mockito.any(String[].class)))
.thenReturn(bc);
// Act
String result = b.getString()[0];
// Assert
assertEquals(result, bc[0]);
}
}