SpringBoot @MockBean 和 @WebMvcTest 不起作用

Kac*_*acu 2 mockito spring-boot spring-boot-test springrunner

控制器.java

@RestController
public class Controller {

    @Autowired
    private UserService userService;

    @Autowired
    private BookService bookService;

    //Below userService implementation
    @PostMapping(value = "/addNewUser", consumes = "application/json")
    public void addNewUser(@RequestBody User newUser) {
        userService.addNewUser(newUser);
    }

    @GetMapping(value = "/findUserById/{id}", produces = "application/json")
    public User findUserById(@PathVariable("id") Long id) {
        return userService.findUserById(id);
    }

    @GetMapping(value = "/findUserByName/{name}", produces = "application/json")
    public User findUserByName(@PathVariable("name") String name) {
        return userService.findUserByName(name);
    }
Run Code Online (Sandbox Code Playgroud)

UserServiceImpl.java

@Transactional
@Service("userService")
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public void addNewUser(User newUser) {
        userRepository.save(newUser);
    }
Run Code Online (Sandbox Code Playgroud)

存储库.java

public interface UserRepository extends CrudRepository<User, Long> {

    Optional<User> findUserByName(String name);

    Optional<User>  findUserBySurname(String surname);
}
Run Code Online (Sandbox Code Playgroud)

控制器测试程序

//@RunWith(SpringRunner.class)
@RunWith(MockitoJUnitRunner.class)
@WebMvcTest(Controller.class)
public class ControllerTest {

//    @MockBean
//    private UserService userService;
//
//    @MockBean
//    private BookService bookService;

    @Mock
    private UserService userService;

    @Mock
    private BookService bookService;

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void test(){

    }
}
Run Code Online (Sandbox Code Playgroud)

上面的配置工作正常,但下面的不行。

@RunWith(SpringRunner.class)
//@RunWith(MockitoJUnitRunner.class)
@WebMvcTest(Controller.class)
public class ControllerTest {

    @MockBean
    private UserService userService;

    @MockBean
    private BookService bookService;

//    @Mock
//    private UserService userService;
//
//    @Mock
//    private BookService bookService;

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void test(){

    }
}
Run Code Online (Sandbox Code Playgroud)

我收到这个错误

应用程序无法启动


描述:

一个组件需要一个无法找到的名为“entityManagerFactory”的 bean。

行动:

考虑在您的配置中定义一个名为“entityManagerFactory”的 bean。

2018-11-26 21:58:32.343 ERROR 7385 --- [ main] ostest.context.TestContextManager :在允许 TestExecutionListener [org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener@5c7bfdc1] 准备测试实例时捕获异常[com.webservices.example.librarydatabaseservice.controller.ControllerTest@74f827ad]

68) ~[junit-rt.jar:na] 在 com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) ~[junit-rt.jar:na] 在 com.intellij。 rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) ~[junit-rt.jar:na] 在 com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) ~[junit -rt.jar:na] 引起:org.springframework.beans.factory.BeanCreationException:创建名为“bookRepository”的 bean 时出错:无法创建 [org.springframework.orm. jpa.SharedEntityManagerCreator] 同时设置 bean 属性 'entityManager'; 嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为 '(inner bean)#3f362135' 的 bean 时出错:设置构造函数参数时无法解析对 bean 'entityManagerFactory' 的引用;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' 在 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:327) ~[spring-beans-5.1.2 .RELEASE.jar:5.1.2.RELEASE] 在 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:131) ~[spring-beans-5.1.2.RELEASE.jar:5.1.2. RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1648) ~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE] 在 org.springframework.beans。springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:117) ~[spring-test-5.1.2.RELEASE.jar:5.1.2.RELEASE] ... 25个常见框架被省略 引起:org. springframework.beans.factory.BeanCreationException:创建名为“(内部 bean)#3f362135”的 bean 时出错:设置构造函数参数时无法解析对 bean“entityManagerFactory”的引用;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' 在 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:378) ~[spring-beans-5.1.2 .RELEASE.jar:5.1.2.RELEASE] 在 org.springframework.beans.factory.support.BeanDefinitionValueResolver。

它说 entityFactoryManager 存在问题,但它以一种模拟方式工作,而另一种则不是......

完整代码Github 存储库

我在版本中使用 SpringBoot:2.1.0.RELEASE

JMB*_*JMB 6

尝试将配置类添加到项目中,如下所示:

@Configuration
@EnableJpaRepositories(basePackages = "com.webservices.example.librarydatabaseservice.repository")
public class RepositoryConfiguration {
}
Run Code Online (Sandbox Code Playgroud)

这个问题与你的测试无关。这是 Spring 启动和加载服务时遇到的问题。在 Mockito 版本的测试中,您不需要它加载所有类并模拟服务/存储库,这样就掩盖了问题。在另一个版本的测试中,SpringRunner 需要加载您的 applicationContext,但由于缺少 JPA 配置而失败。


夢のの*_*のの夢 6

您的测试正在使用entityManagerFactorybean加载 JPA 。在您的主应用程序类中,我认为您已经编写了@EnableJpaRepositories,如果您的存储库位于主应用程序的基本包下,则不需要。删除此注释,因为您的测试类应该仅用于测试 web 层。