使用 Null-check 测试方法运行程序时,JUnit5 ExpectedValue 测试方法失败

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

我有两个单元测试用例方法:TestUserEventExpectedResult()、TestUserEventNullCheck()。我的问题是,当我仅使用 TestUserEventExpectedResult() 方法运行程序时,我可以获得预期结果,并且 TestUserEventExpectedResult() 方法的测试已通过。当我使用 TestUserEventExpectedResult() 和 TestUserEventNullCheck() 方法运行程序时,TestUserEventExpectedResult() 方法失败,而 TestUserEventNullCheck() 通过。

为了更好地理解:

案例1:

  • 现有方法:仅限 TestUserEventExpectedResult()
  • 结果:测试用例通过

案例2:

  • 现有方法: TestUserEventExpectedResult() & TestUserEventNullCheck()
  • 结果:
    • TestUserEventExpectedResult() - 测试失败
    • TestUserEventNullCheck() - 测试通过

当我使用 TestUserEventNullCheck()TestUserEventExpectedResult() 时,测试用例对于 TestUserEventExpectedResult() 方法失败。以下是我的实现。我需要一个可行的解决方案来在同一运行中通过单个文件中的两个测试用例。

Repo Interface - 需要为此存储库编写测试用例

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {

    @Query("select u from User u join fetch u.venues uv where uv.event.id = :eventId and u.id = :userId and u.firstName = :firstName")
    User findUserByEventId(String eventId, int userId, String firstName);
......
}

用户实体

public class User{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    
    private String firstName;
    
    private String lastName;
    
    @OneToMany(targetEntity = UserVenues.class, mappedBy = "user", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private List<UserVenues> venues;
      
    ......
}

事件实体

public class Event{
    @Id
    private int id;
    
    @OneToMany(................)
    private List<UserVenues> user;
    ......  
} 

UserVenue 实体

public class UserVenues{
    @Id
    private int Id;
    
    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "user_Id",  referencedColumnName = "id")
    private User user;
    
    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "event_Id",  referencedColumnName = "id")
    private Event event;
    ......  
}   

两个测试用例

//fails when having the other test method only without the other method it passes fine.
@Test
public void TestUserEventExpectedResult() {
    User user = new User();
    user.setUserId(1);
    user.setFirstName("Alex");
    user.setFirstName("Aron");
    userRepo.save(user);
    testEntityManager.flush();
    testEntityManager.clear();
    
    Event event = new Event();
    event.setEventId(1);
    event.setName("Wedding Party");
    eventRepo.save(event);
    testEntityManager.flush();
    testEntityManager.clear();

    UserVenues userVenue = new UserVenues();
    userVenue.setEventId(1);
    userVenue.setUser(user);
    userVenueRepo.save(userVenue);
    testEntityManager.flush();
    testEntityManager.clear();
    
    User expectedUser = userRepo.findUserByEventId(1, 1, "Alex");
    assertNotNull(expectedUser); //test fails but the object exists with the parameters
}
//Always pass the correct test
@Test
public void TestUserEventNullCheck() {
    User user = new User();
    user.setUserId(1);
    user.setFirstName("Alex");
    user.setFirstName("Aron");
    userRepo.save(user);
    testEntityManager.flush();
    testEntityManager.clear();
    
    Event event = new Event();
    event.setEventId(1);
    event.setName("Wedding Party");
    eventRepo.save(event);
    
    UserVenues userVenue = new UserVenues();
    userVenue.setEventId(1);
    userVenue.setUser(user);
    userVenueRepo.save(userVenue);
    testEntityManager.flush();
    testEntityManager.clear();
    
    User expectedUser = userRepo.findUserByEventId(2, 3, "Tony");
    assertNull(expectedUser); //test passed
}

如果有人知道发生这种情况的正确原因和正确的解决方案,请帮助我。! 谢谢你

java spring-boot jpa junit junit5
1个回答
0
投票

您遇到的问题似乎与测试用例之间的数据状态有关。当两个测试用例同时执行时,它们之间可能存在一些交互或依赖,导致 TestUserEventExpectedResult() 失败。

以下是此问题的各种解决方案:

测试用例的隔离:确保每个测试用例独立于其他测试用例生成或更新的数据的状态。要设置和清理测试环境,请使用测试框架提供的设置和拆卸方法或注释(例如 JUnit 5 中的 @BeforeEach、@AfterEach)。

使用替代数据:您的测试方法中的两个测试用例似乎使用相同的数据(例如 eventId = 1、userId = 1、firstName =“Alex”)。由此可能会导致测试之间的干扰。为了建立独立性,请尝试为每个测试使用不同的数据集。

检查可能影响测试之间数据状态的任何事务或数据库提交。考虑利用事务注释或显式管理事务来隔离每个测试用例执行的更改。

import org.junit.jupiter.api.*;

@TestInstance(TestInstance.Lifecycle.PER_CLASS)

公共类 UserRepositoryTests {

@Autowired
private UserRepository userRepo;

@Autowired
private EventRepository eventRepo;

@Autowired
private UserVenuesRepository userVenueRepo;

@BeforeEach
public void setUp() {
    // Perform setup actions here before each test
    // Clear relevant data or set up the initial state
}

@AfterEach
public void tearDown() {
    // Perform cleanup actions here after each test
    // Rollback transactions, reset state, or clear data
}

@Test
public void testUserEventExpectedResult() {
    // Test logic for expected result
}

@Test
public void testUserEventNullCheck() {
    // Test logic for null check
}

}

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