是否可以在注入其他模拟时给出模拟作为参数?

Is it possible give a mock as argument while injecting other mocks?

我正在使用 JUnit5。

我有以下情况:

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockedStatic;
import org.mockito.junit.jupiter.MockitoExtension;


@ExtendWith(MockitoExtension.class)
public class SomeClassTest {

    // needs to be mocked but not injected
    @Mock
    private EntityManager entityManager;
    
    // needs to be mocked and injected
    @Mock
    private SomeDao someDao;

    @InjectMocks
    private SomeClass someClass = new someClass(entityManager);

public class SomeClass{

   EntityManager entityManager;

   public SomeClass(EntityManager entityManager) {
      if (entityManager == null) {
         throw new NullpointerException("Manager is null");
      } else {
         this.entityManager = entityManager;
}

问题是:

有人知道如何解决这个问题吗?我可以创建一个无参数构造函数,但这会给我一个构造函数,我只需要测试它不是 'clean'.

您应该将 SomeDao someDao 作为参数添加到 SomeClass 构造函数中,然后您将能够使用 @Mock

通过测试来操作它

查看此答案 () Mockito 使用 3 种方式注入模拟。 第一个是在构造函数中注入它,如果有一个接受参数的构造函数的话。

因此,我像@nesmeyana 提到的那样更改了我的构造函数:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

import javax.persistence.EntityManager;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;


@ExtendWith(MockitoExtension.class)
public class SomeClassTest {

    @Mock
    private EntityManager mockEntityManager;

    @Mock
    private SomeDao mockSomeDao;

    @InjectMocks
    private SomeClass someClass;

    @Test
    public void test() {
        when(mockSomeDao.duck()).thenReturn(10);

        assertEquals(10, someClass.bla());
    }
}
public class SomeClass{

   EntityManager entityManager;
   
   SomeDao someDao;


   public SomeClass(EntityManager entityManager, SomeDao someDao) {
      if (entityManager == null) {
         throw new NullpointerException("Manager is null");
      } else {
         this.entityManager = entityManager;

      this.someDao = someDao;
}
public class SomeDao{
    int x = 5;

    public SomeDao(int x) {
        this.x = x;
    }

    public int duck() {
        return x;
    }
}

但是由于我必须更改我的代码才能测试我的 类,所以我不得不重新考虑我的代码编写! 我和所有读到这篇文章的人,应该避免硬依赖并使用 CI(依赖注入)来轻松测试他们的代码。