我正在针对测试数据库测试我的程序,为了进行这些测试,我需要输入数据,我使用 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());
}
}
要解决此问题,您需要在执行每个测试用例后恢复原始标准输入流(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());
}
}