Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring注入:@MockBean@Repository未注入_Spring_Spring Boot_Spring Test - Fatal编程技术网

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));
    }
}