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
尝试将配置类添加到项目中,如下所示:
@Configuration
@EnableJpaRepositories(basePackages = "com.webservices.example.librarydatabaseservice.repository")
public class RepositoryConfiguration {
}
Run Code Online (Sandbox Code Playgroud)
这个问题与你的测试无关。这是 Spring 启动和加载服务时遇到的问题。在 Mockito 版本的测试中,您不需要它加载所有类并模拟服务/存储库,这样就掩盖了问题。在另一个版本的测试中,SpringRunner 需要加载您的 applicationContext,但由于缺少 JPA 配置而失败。
您的测试正在使用entityManagerFactorybean加载 JPA 。在您的主应用程序类中,我认为您已经编写了@EnableJpaRepositories,如果您的存储库位于主应用程序的基本包下,则不需要。删除此注释,因为您的测试类应该仅用于测试 web 层。
| 归档时间: |
|
| 查看次数: |
5335 次 |
| 最近记录: |