3

控制器.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);
    }

UserServiceImpl.java

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

    @Autowired
    private UserRepository userRepository;

    @Override
    public void addNewUser(User newUser) {
        userRepository.save(newUser);
    }

存储库.java

public interface UserRepository extends CrudRepository<User, Long> {

    Optional<User> findUserByName(String name);

    Optional<User>  findUserBySurname(String surname);
}

控制器测试.java

//@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(){

    }
}

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

@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(){

    }
}

我得到这个错误

应用程序无法启动


描述:

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

行动:

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

2018-11-26 21:58:32.343 错误 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] at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) ~[junit-rt.jar:na] at com.intellij。 rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) ~[junit-rt.jar:na] at 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' at 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:创建名称为'(inner bean)#3f362135'的bean时出错:设置构造函数参数时无法解析对bean'entityManagerFactory'的引用;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' at 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

4

2 回答 2

6

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

于 2018-11-27T04:15:47.047 回答
3

尝试向项目中添加一个配置类,如下所示:

@Configuration
@EnableJpaRepositories(basePackages = "com.webservices.example.librarydatabaseservice.repository")
public class RepositoryConfiguration {
}

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

于 2018-11-26T21:23:00.700 回答