我想测试一下我的弹簧应用程序。它需要身份验证,因此我创建了一个用户对象并将其保存在@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
运作良好?
答案 0 :(得分:0)
如documentation中所述:
默认情况下,框架将为每个测试创建并回滚事务。
您可以在测试类上使用@Commit
覆盖它,并将TestTransaction.end()
放在entityManager.clear()
之后。
现在测试工作正常但我仍然无法理解为什么以及UserRepository
如何在不提交交易的情况下工作。