Puc*_*uce 6 java spring-security spring-test spring-data-jpa spring-boot
在 Spring Boot 应用程序中,我想测试(JUnit 5)启用审计(@EnableJpaAuditing)的持久层。我使用 Liquibase 设置 H2 数据库和 Hibernate 作为 JPA 实现。
@Configuration
//@EnableTransactionManagement
@EnableJpaAuditing
//@EnableJpaRepositories
public class MyPersistenceConfig {
}
Run Code Online (Sandbox Code Playgroud)
我的实体有以下字段:
@CreatedDate
@Column(name = "CREATED_AT", updatable = false)
private Instant createdAt;
@CreatedBy
@Column(name = "CREATED_BY", updatable = false)
private String createdBy;
@CreatedDate
@Column(name = "LAST_MODIFIED_AT")
private Instant lastModifiedAt;
@CreatedBy
@Column(name = "LAST_MODIFIED_BY")
private String lastModifiedBy;
Run Code Online (Sandbox Code Playgroud)
我有以下依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<scope>runtime</scope>
<!--<scope>test</scope>-->
</dependency>
<!-- Testing -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我尝试了几种注释组合:
@SpringBootTest //(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
//@DataJpaTest
@ContextConfiguration(classes = MyPersistenceConfig.class)
@EnableAutoConfiguration
//@SecurityTestExecutionListeners
//@Import(SpringBootWebSecurityConfiguration.class)
@WithMockUser(username = "test", password = "test", roles = "USER")
@ExtendWith(SpringExtension.class)
class MyRepositoryTest {
@Autowired
private MyRepository testee;
...
}
Run Code Online (Sandbox Code Playgroud)
但无论我尝试什么,要么存储库为空(自动装配),要么在插入条目时出现异常:
NULL not allowed for column "CREATED_BY"; SQL statement:
Run Code Online (Sandbox Code Playgroud)
我想我需要一个 SecurityContext (当前不可用于自动装配)。
提供与审计和@WithMockUser一起使用的模拟SecurityContext的最简单方法是什么?
小智 -1
@Before
public void setup() {
User user = userService.findByEmail("umanking@gmail.com").get();
SecurityContextHolder.getContext().setAuthentication(new Authentication() {
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return null;
}
@Override
public Object getCredentials() {
return user.getPassword();
}
@Override
public Object getDetails() {
return user;
}
@Override
public Object getPrincipal() {
return null;
}
@Override
public boolean isAuthenticated() {
return true;
}
@Override
public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {
}
@Override
public String getName() {
return user.getName();
}
});
}
Run Code Online (Sandbox Code Playgroud)
也许你可以使用@Before注释
| 归档时间: |
|
| 查看次数: |
3414 次 |
| 最近记录: |