如何模拟String数组

时间:2017-01-30 20:09:19

标签: junit

下面是示例代码,如果这项工作我可以在我的业务代码中使用相同的逻辑。

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;

有谁可以帮我解决这个问题。

1 个答案:

答案 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]);
   }   
}