서버/클라이언트 프로그램에 타사 라이브러리를 사용하고 있습니다. 서버/클라이언트는 특정 데이터 모델을 등록 할 수 있습니다 (세부 사항은 여기서는 중요하지 않습니다). 내 단위 테스트에서JUnit에서 싱글 톤을 "단절"하는 방법은 무엇입니까?
, 나는이 대략 다음
private static MyServerType myServer; // my class, derived from a 3rd party class
private static MyClientType myClient; // my class, derived from 3rd party
private static int modelId = 123; // identifier to identify the data model
@BeforeClass
public static void setUpBeforeClass() throws Exception {
int modelId
myServer = new MyServerType();
myServer.registerDataModel(modelId, new ServerDataModel());
myClient = new MyClientType();
myClient.registerDataModel(modelId, new ClientDataModel());
}
이 코드를 실행하면 실패 - 내부 (우리는 소스 코드를 볼 수 있음) 때문에, 라이브러리가 싱글있다 Id에 의해 모델을 등록하는 정적 클래스 (.getInstance())를 찾고이 Id가 등록 된 모델이 이미 있음을 확인합니다.
클라이언트/서버 상호 작용을 테스트 할 단위 테스트를 어떻게 실행할 수 있습니까? (서버와 클라이언트는 모두 제 3 자 라이브러리 클래스에서 파생 된 자체 프로그램이므로이 둘 모두와 그 상호 작용을 테스트해야합니다.)
@BeforeClass
메서드에서 나는 갓 컴파일 된 섬기는 사람. 이것은 어떻게 든 꽤 못생긴 것 같습니다.
하나의 프로세스에 대해 유닛 테스트 (예 : JVM의 "가상 머신"과 같은)에서 서버 또는 클라이언트를 "격리"하여 getInstance()가 서버 및 클라이언트에 대해 다른 객체를 반환하도록하는 방법이 있습니까? 그룹화 된 스레드/스레드 그룹 또는 이와 유사한?
ps : 예, 이것은 싱글 톤이 악한 이유의 예입니다.하지만 함께 살아야합니다.
EDIT : 비즈니스 논리를 서버 논리에서 분리하여 비즈니스 논리를 독립적으로 테스트 할 수 있습니다. 제가 테스트하고자하는 것은 서버가 비즈니스 로직을위한 적절한 프론트 엔드로 작동한다는 것입니다. 즉, 모든 데이터 변경 사항을 업데이트하고 사용자 요청에 대한 비즈니스 로직에 대한 함수 호출을 트리거합니다.
단위 테스트 (예 : 통합 테스트)에서 이러한 종류의 테스트가 "너무 큽니까"입니까?
특히 : 단순한 클라이언트, 즉 프로토콜을 사용하는 스텁 클라이언트를 사용하는 경우 서버가 올바른 데이터 등을 제공하는지 테스트해야합니다. 그런 테스트 (예 : @Test public void test_publishes_updates_on_VARIABLEX() { ... }
@Test public void test_calls_backend_functionY_and_returns_formatted_reply() { ... }
)는 단위 테스트입니까?
그럼 실제로 이것이 통합 테스트라고 제안 하시겠습니까? (나는 더 정확한 질문을 던졌습니다.) – Moritz
예 - 두 개의 매우 다른 코드 단위의 상호 작용을 테스트하려는 경우 - 통합 테스트가 더 필요합니다. 앞에서 설명한 내용을 통해 일부 사람들은 실제로 샌드 박스에 클라이언트와 서버를 배포하고 클라이언트와 상호 작용 한 다음 수행해야하는 서버 작업을 * 결과 * 확인하여 테스트 할 수 있다고 생각합니다. 이 시나리오에서 진정한 단위 테스트는 클라이언트 또는 서버를 서로 독립적으로 테스트하는 것입니다. 내 서버가이 신호를 수신하면 (실제 클라이언트가 실행될 필요가 없음) - x를 수행해야합니다. 그것은 단위 테스트 일 것입니다. –