使用EntityManager进行Spring启动和安全集成测试

时间:2016-11-03 12:48:14

标签: spring jpa spring-security spring-boot spring-data

我想测试一下我的弹簧应用程序。它需要身份验证,因此我创建了一个用户对象并将其保存在@Before方法中。但我无法进行身份验证,因为我认为init()方法在另一个会话中执行。

IntegrationTest上课:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT)
@Transactional
public class IntegrationTest {

    @PersistenceContext
    private EntityManager entityManager;

    @Autowired
    private PasswordEncoder passwordEncoder;

    @LocalServerPort
    int port;

    private String URL;

    @Before
    public void init() {
        User user = new User();
        user.setUsername("testUser");
        user.setPassword(passwordEncoder.encode("test"));
        user.setEmail("test@test.com");
        user.setEnabled(true);
        entityManager.persist(user);
        entityManager.flush();
        entityManager.clear();

        RestAssured.port = port;

        URL = "http://localhost:" + String.valueOf(port) + "/users/user";
    }

    @Test
    public void givenNotAuthenticatedUser_whenLoggingIn_thenCorrect() {
        final RequestSpecification request = RestAssured.given().auth().basic("testUser", "test");

        request.when().get(URL).then().assertThat().statusCode(200);
    }
}

但如果我使用userRepository并致电

userRepository.save(user);

而不是

entityManager.persist(user);
entityManager.flush();
entityManager.clear();
一切正常。我还必须删除@Transactional注释。

首先我认为这是因为没有提交 - 我看到用户表中没有任何变化。如何强制EntityManager提交数据?

如何在测试中使用EntityManager?为什么UserRepository运作良好?

1 个答案:

答案 0 :(得分:0)

documentation中所述:

  

默认情况下,框架将为每个测试创建并回滚事务。

您可以在测试类上使用@Commit覆盖它,并将TestTransaction.end()放在entityManager.clear()之后。

现在测试工作正常但我仍然无法理解为什么以及UserRepository如何在不提交交易的情况下工作。