繁体   English   中英

Spring Framework - 模拟不是模拟

[英]Spring Framework - Mock is not mocking

我有一个 Spring MVC 应用程序。 (Spring Framework是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));
    }
    ...
    }

但是当我运行测试时,似乎没有嘲笑 repo

这个答案是针对testng 的

MockitoTestExecutionListener初始化MockitoTestExecutionListener ,需要使用@MockBean注解。

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

另外,不要忘记添加ResetMocksTestExecutionListener以防止测试间持久性ResetMocksTestExecutionListener (请参阅此问题)。

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

spring 测试将加载完整的上下文,然后您可以使用@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;

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

在@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));
    }
    ...
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM