【问题标题】:Mock a method call called by another object which is autowired and interface in another class模拟另一个对象调用的方法调用,该对象自动装配并在另一个类中接口
【发布时间】:2021-03-22 12:26:09
【问题描述】:

我想模拟类似的东西

public class B {
   @autowired
   protected SomeInterface c; // interface


   public String methodToBeCalled(SomeClass a, SomeClass b) {
       ... some opertations;
       c.methodIWantToMock(x, y);
   }

}

所以在通常情况下,我会创建一个 B 类的对象,然后将所有其他类初始化为 Mock,但由于 c 是一个接口并且是自动装配的,我还无法找到模拟它的方法,我查阅了其他帖子,但没有一个与此案有关。


有没有办法在春季仅使用 Junit 和 Mockito 实现这一目标。

【问题讨论】:

标签: java spring-mvc junit mockito


【解决方案1】:

让我们假设您没有使用 Spring,并且您想模拟 C。

  1. C 是一个接口并不重要。 Mockito 能够模拟接口 -> 它使用“无操作”方法创建该接口的实现。
SomeInterface c = Mockito.mock(SomeInterface.class);
  1. C 是自动装配的并不重要。您可以使用反射设置它。
    B bObj = new B();
    ReflectionTestUtils.setField(bObj, "c", cMock);
  1. 现在您已设置好模拟并将其设置为 B 中的依赖项,您可以根据需要模拟其方法。
    when(cMock).methodIWantToMock(any(), any()).thenReturn("blah");

现在,让我们假设您正在使用 Spring。

  1. 您可能应该转向构造函数注入:
    @Autowired
    public B(SomeInterface c) {
       this.c = c;
    }
  1. 现在对于纯单元测试方法,您不需要使用 ReflectionTestUtils,您只需使用模拟构建 B。

  2. 如果你使用的是Spring Boot,你可以使用@MockBean

    @SpringBootTest
    @RunWith(SpringRunner.class) // if Junit 4
    // @ExtendWith(SpringExtension.class)  if Junit 5
    class BTest {
    
      @MockBean
      private SomeInterface someInterfaceMock;
    
    }
    

【讨论】:

    【解决方案2】:

    我使用 JUnit4 为您的 B 类编写了单元测试。这可能会对您有所帮助。

    公共类 BTest {

    @Mock
    SomeInterface c;
    
    @InjectMocks
    B b;
    
    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }
    
    @Test
    public void testMethodToBeCalled() throws Exception {
        String result = b.methodToBeCalled(new SomeClassA(), new SomeClassB());
        Assert.assertEquals("", result);
    }
    

    }

    【讨论】:

      猜你喜欢
      • 2023-01-21
      • 1970-01-01
      • 2013-08-16
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多