[英]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;
您不能同时使用@Mock
和Mockito.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.