测试期间 Java 中的输入流问题

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

我正在针对测试数据库测试我的程序,为了进行这些测试,我需要输入数据,我使用 System.setIn 来输入数据。然而,只有第一个测试运行正确;由于错误 java.util.NoSuchElementException:未找到行,所有后续测试都会失败。我尝试使用 mark()reset() 恢复到标准 System.in,但没有帮助。

public class UserProfileInteractionTest {
    
    @BeforeClass
    public static void setUp() {
        assertTrue(DataBaseOperations.openDBConectionTest());
    }
    
    @Test
    public void registerRegisteredProfileTest(){
        String input = "Test test test\[email protected]\ntestpassword\n";
        InputStream in = new ByteArrayInputStream(input.getBytes());
        System.setIn(in);
        User user = new User();
        UserProfileInteraction register = new UserProfileInteraction(user);
        assertFalse(register.registerAccount());
    }
    
    @Test
    public void loginRegisteredProfileTest(){
        String input = "[email protected]\ntestpassword\n";
        InputStream in = new ByteArrayInputStream(input.getBytes());
        System.setIn(in);
        User user = new User();
        UserProfileInteraction register = new UserProfileInteraction(user);
        assertTrue(register.loginAccount());
    }
    
    @AfterClass
    public static void tearDown() {
        assertTrue(DataBaseOperations.closeDBConection());
    }
}
java testing inputstream java-io
1个回答
0
投票

要解决此问题,您需要在执行每个测试用例后恢复原始标准输入流(System.in)。您可以通过使用 @After 方法将 System.in 重置回其原始状态来实现此目的。

在此修改版本中:

  • 我们引入了一个用@After注释的tearDown()方法,它在执行每个测试用例后将System.in重置为其原始状态(originalSystemIn)。

  • 在 setUp() 方法期间,我们将原始 System.in 流存储在名为 OriginalSystemIn 的字段中。

  • @AfterClass 方法 closeConnection() 仍然保留,以确保执行所有测试后正确关闭数据库连接。

    公共类 UserProfileInteractionTest {

     private static InputStream originalSystemIn;
    
     @BeforeClass
     public static void setUp() {
         assertTrue(DataBaseOperations.openDBConectionTest());
         originalSystemIn = System.in;
     }
    
     @Test
     public void registerRegisteredProfileTest(){
         String input = "Test test test\[email protected]\ntestpassword\n";
         InputStream in = new ByteArrayInputStream(input.getBytes());
         System.setIn(in);
         User user = new User();
         UserProfileInteraction register = new UserProfileInteraction(user);
         assertFalse(register.registerAccount());
     }
    
     @Test
     public void loginRegisteredProfileTest(){
         String input = "[email protected]\ntestpassword\n";
         InputStream in = new ByteArrayInputStream(input.getBytes());
         System.setIn(in);
         User user = new User();
         UserProfileInteraction register = new UserProfileInteraction(user);
         assertTrue(register.loginAccount());
     }
    
     @After
     public void tearDown() {
         System.setIn(originalSystemIn); // Reset System.in to its original state
     }
    
     @AfterClass
     public static void closeConnection() {
         assertTrue(DataBaseOperations.closeDBConection());
     }
    

    }

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