Spring注入:@MockBean@Repository未注入
我正在尝试Spring注入:@MockBean@Repository未注入,spring,spring-boot,spring-test,Spring,Spring Boot,Spring Test,我正在尝试@MockBeana@Repository注释类: @Repository public interface ApplicationDao extends MongoRepository<Application, String> {} @Service public class AuthorizationService { private ApplicationDao appsDao; private List<Application> al
@MockBean
a@Repository
注释类:
@Repository
public interface ApplicationDao extends MongoRepository<Application, String> {}
@Service
public class AuthorizationService {
private ApplicationDao appsDao;
private List<Application> allowedApplications;
@Autowired
public AuthorizationService(ApplicationDao appsDao) {
this.appsDao = appsDao; //<<MOCKED INJECTED BEAN>>
this.fillApplications();
}
private void fillApplications() {
this.appsDao.findAll() //<<MOCKED method>>
.forEach(entry -> {
this.allowedApplications.put(entry.getName(), entry);
});
}
public bool isAuthorized(Application application) {
return this.allowedApplications
.stream()
.anyMatch(app -> app.getId().equals(application.getId()));
}
}
我的测试模拟配置如下所示:
@RunWith(SpringRunner.class)
@SpringBootTest()
public class GroupReferencesTest {
private @Autowired AuthorizationService;
private @MockBean ApplicationDao applicationDao;
@Before
public void setUp() {
Application testApplication = new Application();
testApplication.setName("test-application");
List<Application> allowedApplications = new ArrayList<Application>();
allowedApplications.add(testApplication);
Mockito
.when(this.applicationDao.findAll())
.thenReturn(allowedApplications);
}
@Test
public void test() {
Application app = new Application();
app.getId("test-application");
assertTrue(this.authorizationService.isAuthorized(app)); //<<FAILS>>
}
}
然而,它并不正确
应用程序
类为:
public class Application {
private String id;
//setters & getters
}
有什么想法吗?第一件事-测试类型。答:单元测试 您正在启动管理
AuthorizationService
生命周期的Spring上下文,然后尝试注入mock。实际上,Spring IoC容器正在将一个真正的应用程序DAO
(由Spring IoC容器管理的应用程序)注入到授权服务中
解决方案:
由测试运行者管理AuthorizationService
的生命周期(如MockitoJUnitRunner
并将ApplicationDao
mock注入其中):
@RunWith(MockitoJUnitRunner.class)
公共类GroupReferenceTest{
private@InjectMocks AuthorizationService AuthorizationService;
private@Mock ApplicationDao ApplicationDao;
@以前
公共作废设置(){
Application testApplication=新应用程序();
testApplication.setName(“测试应用程序”);
List allowedApplications=new ArrayList();
允许的应用程序。添加(测试应用程序);
莫基托
.when(this.applicationDao.findAll())
。然后返回(允许的应用);
}
@试验
公开无效测试(){
应用程序app=新应用程序();
app.getId(“测试应用程序”);
assertTrue(this.authorizationService.isAuthorized(app));
}
}
工作示例
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {AuthorizationService.class})
public class GroupReferencesTest {
@Autowired
private AuthorizationService;
@MockBean
private ApplicationDao applicationDao;
@Test
public void test() {
//given
Mockito.when(applicationDao.findAll()).thenReturn(emptyList());
//when & then
assertTrue(authorizationService.isAuthorized(app));
}
}
第一个测试类没有显示全部内容:被测试的类是如何实例化的?我提到了GroupReferenceTest类。在GroupReferenceTest
中,您永远不会调用被测试的对象。您刚刚模拟了您是否尝试在实现类而不是接口上添加@Repository
注释?测试失败,因为您按id比较了应用程序,并且没有为模拟数据设置它。关于第二个场景,从bean方法中删除static关键字。在我的项目中,所有这些类都有我在post上显示的更多依赖项。我需要使用SpringRunner
开始测试,以便注入所有其他依赖项。我不明白它怎么不起作用。这是一个非常简单的例子。
@RunWith(MockitoJUnitRunner.class)
public class GroupReferencesTest {
private @InjectMocks AuthorizationService authorizationService;
private @Mock ApplicationDao applicationDao;
@Before
public void setUp() {
Application testApplication = new Application();
testApplication.setName("test-application");
List<Application> allowedApplications = new ArrayList<Application>();
allowedApplications.add(testApplication);
Mockito
.when(this.applicationDao.findAll())
.thenReturn(allowedApplications);
}
@Test
public void test() {
Application app = new Application();
app.getId("test-application");
assertTrue(this.authorizationService.isAuthorized(app));
}
}
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {AuthorizationService.class})
public class GroupReferencesTest {
@Autowired
private AuthorizationService;
@MockBean
private ApplicationDao applicationDao;
@Test
public void test() {
//given
Mockito.when(applicationDao.findAll()).thenReturn(emptyList());
//when & then
assertTrue(authorizationService.isAuthorized(app));
}
}