Spring框架-模拟不是嘲笑

时间:2020-10-14 15:20:04

标签: java spring spring-mvc junit mockito

我有一个Spring MvC应用程序。 (Spring框架是Java平台的应用程序框架和控制容器的倒置),需要进行以下测试:

    @RunWith(SpringJUnit4ClassRunner.class)
    public class AutorisationServiceTest {
    
        @Autowired
        @InjectMocks
        private IAutorisationService service;
    
        @Mock
        PersonneRepository personneRepository = Mockito.mock(PersonneRepository.class);
    
    
        @Before
        public void setup() {
        }
    
    
        @Test
        public void should_Find_GardeWith2Affectations() throws IOException {
    
            when(personneRepository.getAll(anyString())).thenReturn(DataLoader.mockData());
            service.getAll("rules");
        }
    
    }

    @Service
    public class AutorisationService implements IAutorisationService {
    
        private final PersonneRepository personneRepository;
    
        public AutorisationService(PersonneRepository personneRepository) {
            this.personneRepository = personneRepository;
        }

@Override
    public List<User> getAll(String where) {
        return personneRepository.getAll(where));
    }
    ...
    }

但是当我运行测试时,似乎无法模拟仓库

4 个答案:

答案 0 :(得分:1)

您应该决定要编写Spring测试还是Mockito测试。

弹簧测试将加载整个上下文,然后您可以使用 @Autowired @MockBean

@RunWith(SpringJUnit4ClassRunner.class)
public class AutorisationServiceTest {
    
  @Autowired
  private IAutorisationService service;
    
  @MockBean
  PersonneRepository personneRepository;

Mockito测试的运行速度要快得多,但是只有使用 @InjectMocks @Mock 明确配置的对象:

@RunWith(MockitoJUnitRunner.class)
public class AutorisationServiceTest {
  
  @InjectMocks
  private IAutorisationService service;
    
  @Mock
  PersonneRepository personneRepository;

请注意,使用批注和专用运行器时,您不必使用Mockito.mock()来模拟该模拟。

我猜您的PersonneRepository是@ Service,@ Component或@Repository。因此,您也应该在此处使用自动接线:

@Service
public class AutorisationService implements IAutorisationService {

   @Autowired    
   private PersonneRepository personneRepository;

答案 1 :(得分:0)

您不能同时使用@MockMockito.mock。选择其中之一

答案 2 :(得分:0)

在@Before设置方法中,您需要添加MockitoAnnotations.initMocks(this)。这将注入您的模拟服务。我已经修改了以下代码:

@RunWith(SpringJUnit4ClassRunner.class)
    public class AutorisationServiceTest {
    
        @Mock
        PersonneRepository personneRepository;

        @InjectMocks
        private AutorisationService service;
    
        @Before
        public void setup() {
          MockitoAnnotations.initMocks(this);
        }
    
    
        @Test
        public void should_Find_GardeWith2Affectations() throws IOException {
    
            when(personneRepository.getAll(anyString())).thenReturn(DataLoader.mockData());
            service.getAll("rules");
        }
    
    }

    @Service
    public class AutorisationService implements IAutorisationService {
    
        private final PersonneRepository personneRepository;
    
        public AutorisationService(PersonneRepository personneRepository) {
            this.personneRepository = personneRepository;
        }

@Override
    public List<User> getAll(String where) {
        return personneRepository.getAll(where));
    }
    ...
    }

答案 3 :(得分:0)

MockitoTestExecutionListener初始化模拟,您需要使用@MockBean注释。

@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners(MockitoTestExecutionListener.class)
public class AutorisationServiceTest {   
    @MockBean
    PersonneRepository personneRepository;