Spring MVC Sping Boot 单元测试-测试失败,抱怨未定义“entityManagerFactory”Bean

gkl3eglg  于 2022-11-14  发布在  Spring
关注(0)|答案(6)|浏览(181)

我正在尝试为一个Sping Boot 应用程序中的控制器编写一个单元测试。这个应用程序运行得很顺利,我的问题是运行它的测试
下面是测试代码:

@RunWith(SpringRunner.class)
@WebMvcTest(MyController.class)
@AutoConfigureTestEntityManager
public class MyControllerTest {

@Autowired
private MockMvc mockMvc;

@Mock
private MyRepository myRepository;

@Mock
ZendeskNotifier zendeskNotifier;

@Mock
ActivityLogger activityLogger;

@Before
public void setUp() throws Exception {
    MockitoAnnotations.initMocks(this);
}

@Test
public void cannotSendFooWithoutMessageBody() throws Exception {
    this.mockMvc.perform(post("/api/v1/foo/1/send"))
            .andDo(print())
            .andExpect(status().is4xxClientError())
            .andExpect(content().string(containsString("The message body cannot be empty.")));
}
}

当我试着运行它时,我得到:

***************************
APPLICATION FAILED TO START
***************************

Description:

Field jobEventRepository in foo.bar.util.memsource.svc.MemsourceEventProcessor required a bean named 'entityManagerFactory' that could not be found.

Action:

Consider defining a bean named 'entityManagerFactory' in your configuration.

这让我感觉很奇怪,因为我提供了AutoConfigureTestEntityManager注解,并希望所有与EntityManager相关的东西都在适当的位置。

lawou6xi

lawou6xi1#

我发现有一个注解可以用来将JPA支持添加到WebMVCTest**(@AutoConfigureDataJpa)**

@ContextConfiguration(classes = { SurchargesTestConfiguration.class })
@WebMvcTest(SurchargesApiController.class)
@AutoConfigureDataJpa
@ActiveProfiles("local")
class SurchargesApiControllerTest {

    @Autowired
    private MockMvc mvc;

    @Test
    void testNotFound() throws Exception {
        mvc.perform(get("/surcharges/marketnumber") //
                .headers(getDefaultHeaders())) //
                .andExpect(status().isNotFound());
    }
}
fnatzsnv

fnatzsnv2#

如果你使用的是Sping Boot ,你可能需要在你的测试类中添加@DataJpaTest。它在org.springframework.boot:spring-boot-test-autoconfigure中。你也可能在重新运行时发现你需要声明一个对org.hibernate:hibernate-validator的依赖。

hrysbysz

hrysbysz3#

mockito测试类中注入Spring的TestEntityManager

@Autowired
private TestEntityManager entityManager;

您已经在测试类上使用@AutoConfigureTestEntityManager来自动配置此测试实体管理器。因此,您不必在配置文件中执行任何其他操作。

p8ekf7hl

p8ekf7hl4#

Sping Boot 正在加载应用程序的配置,导致数据层被初始化。
摘自Sping Boot 的文档,检测测试配置:
Sping Boot 的@*Test注解会自动搜寻您的主要设定,只要您没有明确定义
搜索算法从包含测试的包开始,直到找到一个用@SpringBootApplication或@SpringBootConfiguration注解的类。只要你以合理的方式组织你的代码,你的主配置通常会被找到。
当扫描到main类时,很可能会找到@EnableJpaRepositories之类的注解,它会初始化数据层,因此需要实体管理器工厂(您可能还会看到其他副作用,例如Hibernate会初始化内存中的数据库(如果应用程序使用该数据库))。
正如其他答案所建议的,您可以初始化数据层,或者尝试连接/模拟缺少的bean。但是由于您在这里不是测试数据层,因此最好控制测试的配置。
这些文档提出了一些解决方案:
1.将@EnableJpaRepositories从主类移动到子包中的配置类。它将被应用程序扫描(从顶部包向下),而不是被单元测试扫描。这在用户配置和切片一节中讨论。
1.加入巢状@Configuration类别,以覆写公寓测试所使用的组态。
第一个规则似乎是一个很好的规则,其他注解,如@EnableBatchProcessing@EnableScheduling,也可以用同样的方法处理,这将加快单元测试的速度。

ktecyv1j

ktecyv1j5#

您需要配置entityManagerFactory,可以参考下面的代码

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="packagesToScan" value="org.demo.test.entity" />
<property name="dataSource" ref="dataSource" />

<property name="jpaProperties">
    <props>
        <prop key="hibernate.show_sql">true</prop>
        <prop key="hibernate.hbm2ddl.auto">create</prop>
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
    </props>
</property>

<property name="persistenceProvider">
    <bean class="org.hibernate.jpa.HibernatePersistenceProvider">
</bean>
</property>

</bean>
waxmsbnn

waxmsbnn6#

将@EnableJpaRepositories从主类移动到子包中的配置类。应用程序将扫描它(从顶层包向下),但单元测试不会扫描它。

@Configuration
@EnableJpaRepositories(
    value = "com.company.repository"
)
public class JpaConfig {
}

相关问题