junit 如何模拟字符串数组

ie3xauqp  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(147)

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

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);
}
}

单位:

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“mock主类”,但我得到的是“inside main class”
有没有人可以帮我解决这个问题。

33qvvth1

33qvvth11#

你正在注入一个A的Mock,但是在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]);
   }   
}

相关问题