Spring Couchbase存储库不会在JUnit 5 BeforeEach方法中保存数据

问题描述 投票:2回答:1

我使用的是Spring Boot 2.1.2.RELEASE,并尝试使用JUnit 5来测试Repository。

用于couchbase的Spring Boot应用程序配置。

spring:
  couchbase:
    bootstrap-hosts: localhost
    bucket:
      name: default
      password: password
  data:
    couchbase:
      auto-index: true

我使用Docker compose在Docker中启动Couchbase,它目前运行最新的6.0。

version: '3.3' # specify docker-compose version

# Define the services/containers to be run
services:

  couchbase:
    image: couchbase
    ports:
      - "8091:8091"
      - "8092:8092"
      - "8093:8093"
      - "8094:8094"
      - "11210:11210"
    volumes:
      - couchbasedata:/opt/couchbase/var
volumes:
    couchbasedata:   

项目中使用的文件。

@Data
@AllArgsConstructor
@NoArgsConstructor
@Document
@Builder
public class Assignment {

    @Id
    @GeneratedValue(strategy = GenerationStrategy.UNIQUE)
    private String id;

    //private int index;
    private String roomNumber;
    private String assignee;
    @Builder.Default
    private Status currentStatus = Status.PENDING;

}

和分配的存储库。

@ViewIndexed(designDoc = "assignment", viewName = "all")
public interface AssignmentRepository extends CouchbasePagingAndSortingRepository<Assignment, String> {

    List<Assignment> findAll();
}

和存储库的测试代码。

@SpringBootTest
@Slf4j
public class AssignmentRepositoryTest {

    @Autowired
    private AssignmentRepository assignmentRepository;


    @BeforeEach
    public void beforeEach() {
        log.debug("before each:::");
        this.assignmentRepository.deleteAll();


        Assignment assignment = Assignment.builder().assignee("Tom").roomNumber("101").build();
        Assignment assignment2 = Assignment.builder().assignee("Tom").roomNumber("102").build();

        this.assignmentRepository.saveAll(Arrays.asList(assignment, assignment2));

        log.debug("saved assignments: {}", this.assignmentRepository.findAll());
    }

    @AfterEach
    public void afterEach() {
        log.debug("after each:::");
        this.assignmentRepository.deleteAll();
    }

    @Test
    public void testGetAll() {
        List<Assignment> assignments = this.assignmentRepository.findAll();
        assertEquals(2, assignments.size());
    }

}

当我运行此测试时,它失败了。我发现qazxsw poi没有按预期工作,qazxsw poi打印出一个空列表。

saveAll

更新:我在测试包中添加了log.debug("saved assignments: {}", this.assignmentRepository.findAll());as,并将其导入测试类,不幸的是它仍然没有按预期工作。

2019-02-28 09:01:57.865 DEBUG 16608 --- [           main] c.example.demo.AssignmentRepositoryTest  : before each:::
2019-02-28 09:01:58.128 DEBUG 16608 --- [           main] d.c.c.m.e.AbstractCouchbaseEventListener : onBeforeConvert(Assignment(id=null, roomNumber=101, assignee=Tom, currentStatus=PENDING))
2019-02-28 09:01:58.174 DEBUG 16608 --- [           main] c.c.m.e.ValidatingCouchbaseEventListener : Validating object: Assignment(id=null, roomNumber=101, assignee=Tom, currentStatus=PENDING)
2019-02-28 09:01:58.456 DEBUG 16608 --- [           main] d.c.c.m.e.AbstractCouchbaseEventListener : onAfterSave(Assignment(id=fbedcace-c6db-45db-a788-9aa688b0a068, roomNumber=101, assignee=Tom, currentStatus=PENDING), CouchbaseDocument{id=fbedcace-c6db-45db-a788-9aa688b0a068, exp=0, payload={roomNumber=101, currentStatus=PENDING, _class=com.example.demo.domain.Assignment, assignee=Tom}})
2019-02-28 09:01:58.457 DEBUG 16608 --- [           main] d.c.c.m.e.AbstractCouchbaseEventListener : onBeforeConvert(Assignment(id=null, roomNumber=102, assignee=Tom, currentStatus=PENDING))
2019-02-28 09:01:58.457 DEBUG 16608 --- [           main] c.c.m.e.ValidatingCouchbaseEventListener : Validating object: Assignment(id=null, roomNumber=102, assignee=Tom, currentStatus=PENDING)
2019-02-28 09:01:58.461 DEBUG 16608 --- [           main] d.c.c.m.e.AbstractCouchbaseEventListener : onAfterSave(Assignment(id=5cdf11e1-f50f-47f0-acfd-a31f0b4970be, roomNumber=102, assignee=Tom, currentStatus=PENDING), CouchbaseDocument{id=5cdf11e1-f50f-47f0-acfd-a31f0b4970be, exp=0, payload={roomNumber=102, currentStatus=PENDING, _class=com.example.demo.domain.Assignment, assignee=Tom}})
2019-02-28 09:02:04.723 DEBUG 16608 --- [           main] c.example.demo.AssignmentRepositoryTest  : saved assignments: []
2019-02-28 09:02:04.790 DEBUG 16608 --- [           main] c.example.demo.AssignmentRepositoryTest  : after each:::

我创建了一个示例项目来重现我遇到的问题,从@TestConfiguration查看它。

spring spring-boot spring-data couchbase spring-data-couchbase
1个回答
1
投票

默认情况下,Couchbase中的视图最终是一致的。

以下是关于它的文档:@TestConfiguration @Slf4j @Order(0) public class TestCouchbaseConfig extends AbstractCouchbaseConfiguration { @Autowired private Environment env; @Override public IndexManager indexManager() { return new IndexManager(true, true, true); } @Override protected List<String> getBootstrapHosts() { return Arrays.asList(env.getProperty("spring.couchbase.bootstrap-hosts").split(",")); } @Override protected String getBucketName() { return env.getProperty("spring.couchbase.bucket.name"); } @Override protected String getBucketPassword() { return env.getProperty("spring.couchbase.bucket.password"); } @Override protected Consistency getDefaultConsistency() { return Consistency.STRONGLY_CONSISTENT; //READ_YOUR_OWN_WRITES|UPDATE_AFTER ... etc; } }

您可以通过定义Java配置类来更改默认行为:

my Github

PS:正如您可能猜到的,STRONGLY_CONSISTENT没有默认值那么快,因此如果您需要最高性能,我建议您仅在测试期间启用STRONGLY_CONSISTENT。

PS2:按键操作总是强一致(findById,保存,更新等)

© www.soinside.com 2019 - 2024. All rights reserved.