package io;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import process.NumberExtract;
import separator.Separator;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
class InputTest {
private final InputStream systemIn = System.in;
private Input input;
private ByteArrayInputStream testIn;
@BeforeEach
void setUp() {
this.input = new Input();
}
private void setInput(String data) {
testIn = new ByteArrayInputStream(data.getBytes());
System.setIn(testIn);
}
@AfterEach
public void restoreSystemInputOutput() {
System.setIn(systemIn);
}
@DisplayName("Default 구분자 기준으로 숫자 추출")
@Test
void testExtractNumberInput(){
String input = "1,2:3";
List<Integer> expectNumber = List.of(1,2,3);
List<Integer> actualNumber = NumberExtract.split(input, Separator.getAllSeparators());
assertEquals(expectNumber,actualNumber);
}
@DisplayName("Default 구분자 기준으로 검증 통과")
@Test
void testDefaultSeparatorValidationSuccess(){
String testInput = "1,2:3\nexit\n";
setInput(testInput);
String result = input.getNumberList().toString();
assertEquals("[1,2,3]",result);
}
}
현재 이 코드에서 무한 로딩 문제가 발생하였다.나와 같은 문제를 가진 사람들을 찾아보았다. https://stackoverflow.com/questions/75029249/junit5-test-keeps-on-running-and-does-not-pass-or-fail
JUnit5 test keeps on running and does not pass or fail
I have a class that has a method to add new student objects into an arraylist. The instance variables are passed through the console and the user input is validated (name should not be empty, phone
stackoverflow.com
해당 글을 통해 알 수 있던 건, Input 클래스가 먼저 생성되어서 발생한 문제인 것을 확인할 수 있었다. 그래서 Input 클래스를 메서드 안에서 생성하기로 바꾸었다.
import error.ErrorMessage;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
class CalculateTest {
@Test
@DisplayName("정상적인 숫자 리스트 합 계산")
void testAddSuccess() {
List<Integer> numberList = Arrays.asList(1, 2, 3);
int result = Calculate.add(numberList);
assertEquals(6, result);
}
@Test
@DisplayName("비어져 있으면 합은 0")
void testAddEmptyList() {
List<Integer> numberList = Collections.emptyList();
int result = Calculate.add(numberList);
assertEquals(0, result);
}
}
package separator;
import error.ErrorMessage;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class AdditionSeparatorTest {
IllegalArgumentException getException(String input) {
IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> {
AdditionSeparator.extractCustomSeparator(input);
});
return exception;
}
@Test
@DisplayName("정삭적인 커스텀 구분자 추출 후 Separator에 추가")
void testExtractCustomSeparator() {
String input = "//a\\n1a2a3";
AdditionSeparator.extractCustomSeparator(input);
assertTrue(Separator.getAllSeparators().contains("a"));
}
@Test
@DisplayName("커스텀 구분자를 추출 한 후의 문자열")
void testExtractCustomSeparatorContainInput() {
String input = "//a\\n1a2,3a4";
String expectString = AdditionSeparator.extractContentAfterSeparator(input);
assertEquals("1a2,3a4", expectString);
}
@Test
@DisplayName("커스텀 구분자가 연속으로 존재하면 예외 발생")
void testExtractCustomSeparatorContinuousSeparator() {
String input = "//a\\n1a2aa3";
assertEquals(getException(input).getMessage(), ErrorMessage.CONTINUOUS_SEPARATOR.getMessage());
}
@Test
@DisplayName("커스텀 구분자가 비어있으면 예외 발생")
void testExtractCustomSeparatorEmpty() {
String input = "//\\n1,2,3";
assertEquals(getException(input).getMessage(), ErrorMessage.CUSTOM_NOT_EMPTY.getMessage());
}
@Test
@DisplayName("커스텀 구분자가 숫자이면 예외 발생")
void testExtractCustomSeparatorIsNumber() {
String input = "//1\\n1,2,3";
assertEquals(getException(input).getMessage(), ErrorMessage.CUSTOM_NOT_NUMBER.getMessage());
}
@Test
@DisplayName("커스텀 구분자가 기존 구분자와 중복되면 예외 발생")
void testExtractCustomSeparatorHasDuplicate() {
String input = "//,\\n1,2,3";
assertEquals(getException(input).getMessage(), ErrorMessage.DUPLICATE_CUSTOM_SEPARATOR.getMessage());
}
}
package process;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import separator.Separator;
import java.util.Collections;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
class NumberExtractTest {
@Test
@DisplayName("구분자를 제거하고 숫자 리스트로 반환")
void testSplit() {
String input = "1,2,3";
List<String> separator = Separator.getAllSeparators();
List<Integer> expectList = NumberExtract.stringToIntegerList(input, separator);
assertEquals(List.of(1, 2, 3), expectList);
}
@Test
@DisplayName("구분자가 없는 입력 에러 발생")
void testSplitNoSeparators() {
String input = "123";
List<String> separator = Separator.getAllSeparators();
List<Integer> expectList = NumberExtract.stringToIntegerList(input, separator);
assertEquals(List.of(123), expectList, "구분자가 없는 경우 숫자 리스트가 예상과 다릅니다.");
}
@Test
@DisplayName("입력값이 비어있는 경우 emptyList 반환")
void testSplitWhenInputIsNull() {
String input = "";
List<String> separator = Separator.getAllSeparators();
List<Integer> expectList = NumberExtract.stringToIntegerList(input, separator);
assertEquals(Collections.emptyList(), expectList);
}
}
stringCalculatePOJO(2) - [Refactor] 인터페이스 상속 -> enum (0) | 2025.02.17 |
---|---|
stringCalculatePOJO(1) - IntelliJ에서 Test 디렉토리 생성 (1) | 2025.02.14 |
AddStringPOJO(5) - [Refactor] 메서드 책임 분할 (0) | 2025.02.03 |
addStringPOJO(4) - 정적 메서드로 변경 (0) | 2025.01.09 |
addStringPOJO(3) - 예외 처리 방식 변경 (0) | 2025.01.05 |