JUnit 및 Mockito를 사용하여 Java에서 셀 테스트 작성
테스트는 모든 소프트웨어 시스템과 응용 프로그램에 매우 중요하다.또한 오류를 쉽게 찾아내고, 특히 시간이 지남에 따라 시스템이 확장될 때 애플리케이션 충돌과 다운타임을 방지할 수 있습니다.처음에는 중요하지 않은 것 같았지만 시스템이 발전하고 복잡해지면서 오류가 발생해 주의하지 않을 가능성도 높아졌다.
Java에는 다양한 테스트 프레임워크가 있는데 jUnit는 가장 광범위한 테스트 프레임워크 중 하나입니다.본고에서, 우리는 jUnit가 제공한 몇 가지 간단한 API와, 그것들을 단원 테스트에 어떻게 사용하는지 소개할 것이다.대부분의 경우, jUnit는 부족합니다. 보통 jUnit + Mockito 조합을 찾을 수 있습니다.
모르는 사람들에게 Mockito는 테스트에 사용되는 또 다른 프레임워크입니다. 테스트할 클래스를 쉽게 격리하고 다른 클래스나 구성 요소의 출력을 제어할 수 있도록 클래스를 모의할 수 있습니다.모크가 호출되었는지, 호출된 횟수, 그리고 기타 더 유용한 기능을 검사할 가능성도 제공한다.
jUnit에서 결과 검증
단원 테스트에서 가장 간단하고 광범위하게 사용되는 특성은 수신된 결과가 예상한 결과인지 확인하는 것이다.이것은 테스트를 작성할 때 자주 사용하는 기본 기능이다. 왜냐하면 방법이 실제 정답으로 되돌아오는지 확인해야 하기 때문이다.이것은 사용을 통해
methods.
```java
@Test
public void aSimpleTest() {
int aNumber = 5;
String str = "A test string";
double aDouble = 4.67;
Assert.assertEquals(5, aNumber);
Assert.assertEquals("A test string", str);
Assert.assertEquals(4.67004, aDouble, 0.001);
}
이중 변수 단언에 대한 주석.비록 숫자가 완전히 같지는 않지만, 테스트는 여전히 통과되었다.이것은 방법의 마지막 매개 변수가 정밀도를 대표하기 때문이다.이것은 우리가 결과에서 허용하는 편차이며, 여전히 그것이 효과적이라고 여긴다.더 높은 정밀도를 얻으려면 삼각주를 축소하기만 하면 된다.테스트에 대한 사용자 정의 오류 메시지
때때로 테스트에 실패한 상황에서 사용자 정의 메시지를 표시하는 것이 중요하다.전체 스택 추적에 접근하기 어려운 자동 생성 과정에서 이 기능은 많은 시간을 절약할 수 있다.사용자 정의 메시지를 사용하면 오류, 변수가 정확하지 않거나 상황을 이해하는 데 도움이 되는 모든 정보를 쉽게 인쇄할 수 있습니다.이것은 Assert의 재부팅 방법을 사용하여 이루어진 것으로, 이러한 방법은 먼저 메시지 파라미터를 가지고 있으며, 아래와 같다.
@Test
public void aSimpleTestWithMessage() {
String myStr = "This test will fail";
Assert.assertEquals("The myStr variable is not the expected value", "Nothing", myStr);
}
jUnit에서 복잡한 객체 유효성 검사 결과 사용
대부분의 경우, 여러 필드를 가진 복잡한 대상을 가질 것입니다.그것들을 검사하는 것은 검사를 간단하게 하는 것과 마찬가지로 쉽다.jUnit은 equals () 방법을 사용하여 예상한 결과와 같은 결과를 받았는지 확인합니다.이것이 바로 이런 상황에서 대상을 위해 정확하게 작성된 equals () 방법을 작성하는 것이 왜 중요한가 하는 것이다.이 데이터 클래스를 살펴보겠습니다.
public class DataClass {
private String field1;
private String field2;
private int field3;
public DataClass(String field1, String field2, int field3) {
this.field1 = field1;
this.field2 = field2;
this.field3 = field3;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DataClass dataClass = (DataClass) o;
return Objects.equals(field1, dataClass.field1)
&& Objects.equals(field2, dataClass.field2)
&& Objects.equals(field3, dataClass.field3);
}
}
equals () 방법이 정확하게 작성되었기 때문에 두 개의 다른 대상이 있어도 테스트는 통과할 수 있습니다.@Test
public void testComplexObject() {
DataClass obj1 = new DataClass("f1Value", "f2Value", 3);
DataClass expected = new DataClass("f1Value", "f2Value", 3);
Assert.assertEquals(expected, obj1);
}
그러나 어떤 경우, 당신은 완전히 같은 대상으로 돌아가는 것을 확보하기를 원합니다. 이 모든 것은 매우 재미있습니다.이것은 단언으로 실현된 것이다.같은 방법.Assert와 동일한 방식으로 작동합니다.assertEquals(). 그러나 내용을 검사하지 않고 실제 대상 인용을 검사합니다.그것을 사용하면 예상과 결과가 동시에 나타나야만 테스트가 통과할 수 있다.유효성 검사 예외는 jUnit에서 발생합니다.
또 다른 유용한 기능은 잘못된 입력을 받았을 때 이 방법이 정확한 이상을 일으켰는지 검증하는 것이다.여러 가지 방법으로 이 점을 해낼 수 있지만, 간단한 방법은
주석.이것은 jUnit에 제공된 이상이 정확하면 테스트에서 이 이상을 던진다는 것을 알려 줍니다.
@Test(expected = NumberFormatException.class)
public void testNumberParse() {
Integer.parseInt("a");
}
Mockito를 사용하여 응답을 시뮬레이션하는 방법
복잡한 시스템에는 여러 개의 상호작용하는 구성 요소와 종류가 있다.이런 시스템에서는 모든 구성 요소를 동시에 테스트하기 어렵다. 모든 구성 요소가 어떻게 작동하는지 모르거나, 모든 구성 요소를 정확하게 설정하고 테스트를 실행하는 데 시간이 오래 걸리기 때문이다.이것이 바로 모크의 개념을 도입한 이유다.mock은 복제 클래스의 API이지만 아무 처리도 하지 않는 객체입니다.반대로, 그것은 단지 네가 알려준 내용을 되돌려줄 뿐이다.
이것은 단원 테스트에 매우 유용합니다. 이것은 클래스만 주목하고, 클래스가 사용하는 다른 대상의 내부 작업을 무시할 수 있도록 하기 때문입니다.예를 들어, 서비스를 테스트하고 집합이 정확한지 확인하고자 한다면.이 서비스는 하나 이상의 DAO를 사용하여 데이터베이스에서 원본 데이터를 검색합니다.너는 데이터베이스에 데이터를 쓰고 싶지 않고, 매번 데이터베이스를 눌러서 더 느린 테스트를 하고 싶지도 않다.
이 경우 DAO 시뮬레이션을 하고 모든 테스트가 무엇을 되돌려주는지 알려 줍니다.Mockito를 사용하면 쉽게 할 수 있습니다.
private static MyDao mockDao;
@BeforeClass
public static void setup() {
// Initialize the mock of the type MyDao
mockDao = Mockito.mock(MyDao.class);
}
현재, 아날로그 DAO 대상을 서비스로 설정하거나 (setter를 통과하거나 의존항 주입 메커니즘을 사용함) DAO를 호출할 때 되돌려야 할 내용을 지정해서 테스트를 작성할 수 있습니다.이것은 우리의 원시 물품이다.Dell은 DAO가 작성되지 않은 경우에도 서비스가 유효한지 테스트하고자 합니다.public class MyService {
private MyDao dao;
public void setDao(MyDao dao) {
this.dao = dao;
}
public boolean process(String id) {
if (id == null) return false;
List<DataClass> all = dao.getAll();
if (all == null || all.isEmpty()) return false;
DataClass ofInterest = dao.get(id);
if (ofInterest == null) return false;
// do some processing
return true;
}
}
public class MyDao {
public List<DataClass> getAll() {
return Collections.emptyList();
}
public DataClass get(String id) {
return null;
}
public void save() {
// do nothing
}
}
모크 DAO를 서비스의 대상으로 설정하고 호출할 때 정확한 데이터를 되돌려준다고 알려 드리겠습니다.이런 방식을 통해 우리는 개발과 테스트 집행을 가속화시켰다.@Test
public void testService() {
MyService service = new MyService();
service.setDao(mockDao);
Mockito.when(mockDao.getAll()).thenReturn(Arrays.asList(new DataClass("a", "b", 3)));
Mockito.when(mockDao.get(Mockito.eq("a"))).thenReturn(new DataClass("a", "b", 4));
boolean result = service.process("a");
Assert.assertEquals(true, result);
}
모키토.when () 방법은 아날로그 호출 시 무엇을 되돌려주는지 알려 줍니다.또한 제공된 지원 방법인 Mockito를 사용하여 매개변수가 있는 방법에 원하는 매개변수를 지정할 수도 있습니다.모키토.모키토성냥마찬가지테스트 데이터 준비 및 정리
복잡한 시스템에 대해 일부 테스트는 더욱 복잡해지기 때문에 다른 시스템이나 일부 코드와 상호작용을 해야만 정상적으로 작동할 수 있다.테스트 데이터를 작성해야 하거나, 특성이나 기능을 열어야 하거나, 환경 변수를 설정해야 한다.키트의 모든 테스트에서 이 동작을 수행할 수 있으며, jUnit의 Before와 After 기능을 사용하여 모든 내용을 정확하게 초기화하고 정리할 수 있습니다.
jUnit은 이 점을 실현하는 데 도움을 줄 수 있는 네 가지 중요한 주석이 있습니다: @Before와 @BeforeClass, 그리고 @After와 @AfterClass.
@Before 메모 방법을 사용하여 클래스의 각 테스트 전에 수행합니다.하면, 만약, 만약...
, @Before는 각 테스트 방법이 실행되기 전에 실행됩니다.마찬가지로 @After는 옷 한 벌의 매번 테스트 후에 실행됩니다.
나머지 두 개의 주석 @BeforeClass와 @AfterClass는 모든 테스트가 실행되기 전과 모든 테스트가 끝난 후에 테스트 결과가 어떻든지 간에 한 번만 실행됩니다.이러한 방법은 환경을 준비하고, 어떠한 테스트 데이터를 작성하며, 필요한 정리를 하는 데 매우 유용하며, 환경이 깨끗한 상태에 있고 공중에 떠 있는 데이터가 없도록 확보하는 데 매우 유용하다.
결론
자바는 jUnit과 Mockito의 도움말 아래 코드 작성 단위 테스트에 필요한 모든 기능과 기능을 제공합니다.비록 이것은 불편을 가져올 수 있지만, 좋은 테스트를 작성하면 오류를 더욱 빨리 식별하고, 건장하고 안정적인 소프트웨어 시스템을 유지하는 데 도움을 줄 것이다.
여느 때와 마찬가지로, 너는 나의 개인 사이트에서 완전한 예시 코드를 다운로드할 수 있다.
기사는 최초로 나의 개인 홈페이지Using jUnit and Mockito for unit testing in Java에 발표되었다.
Reference
이 문제에 관하여(JUnit 및 Mockito를 사용하여 Java에서 셀 테스트 작성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/pazvanti/writing-unit-tests-in-java-using-junit-and-mockito-599텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)