2017-10-28 1 views
-1

내 클래스 객체를 채우는 json 객체를 읽었으므로 클래스 객체를 조롱하고 어떤 방법으로 최선의 방법인지 모르겠습니다. 내 방법은 다음과 같습니다.특정 클래스 객체를 조롱했습니다. stubs tests mockito

public List<Person> readFile(String filename) { 
    List<Person> list = new ArrayList<Person>(); 
    JSONParser parser = new JSONParser(); 
    int count = 0; 

    try { 
     Object obj = parser.parse(new FileReader(
       filename)); 

     JSONObject jsonObject = (JSONObject) obj; 
     JSONArray array = (JSONArray) jsonObject.get("people"); 
     //System.out.println("Debug: " + array.size()); 
     if(array != null) { 
      while (count < array.size()) { 
       Person person = new Person(); 
       JSONObject people = (JSONObject) array.get(count); 
       person.setName((String) people.get("name")); 
       Long age = (Long) people.get("age"); 
       person.setAge(Integer.valueOf(age.intValue())); 
       person.setSex((String) people.get("sex")); 
       person.setIllness((String) people.get("illness")); 
       list.add(person); 
       count++; 
      } 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return list; 
} 

이 경우 파일 이름을 사용하고 목록 (이 경우 특정 파일 개체 목록)을 반환합니다. 지금까지 테스트 한 내용은 다음과 같습니다.

package pricing; 

import static org.junit.Assert.assertEquals; 
import static org.junit.Assert.assertTrue; 
import static org.mockito.Mockito.mock; 
import static org.mockito.Mockito.when; 

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

import org.junit.BeforeClass; 
import org.junit.Test; 

import com.pricing.DiscountPricing; 
import com.pricing.model.Person; 

@SuppressWarnings("deprecation") 
public class DiscountPricingTest { 

private static DiscountPricing mockDPclass; 
private static Person mockPerson1; 
private static Person mockPerson2; 
private static Person mockPerson3; 

@BeforeClass 
public static void setUp() { 
    mockDPclass = mock(DiscountPricing.class); 
    mockPerson1 = new Person(50, "Allergies", "Kelly", "female"); 
    mockPerson2 = new Person(40, "Sleep Apnea", "Josh", "male"); 
    mockPerson3 = new Person(20, "Heart Disease", "Brad", "male"); 
} 

@Test 
public void readFileTest() { 
    String filename = "Consumers.json"; 
    DiscountPricing dpclass = new DiscountPricing(); 
    List<Person> allPeople = dpclass.readFile(filename); 
    List<Person> mockPeople = new ArrayList<Person>(); 
    mockPeople.add(mockPerson1); 
    mockPeople.add(mockPerson2); 
    mockPeople.add(mockPerson3); 
    assertEquals(mockPeople.size(), allPeople.size()); 
    assertTrue(allPeople.get(0).getName().equals("Kelly")); 
} 
} 

Mockito를 사용하여 저의 조롱 사용이 올바른지 알고 싶습니까?

답변

1

시험하려는 수업을 조롱하지 않았습니다. 예 : mockedYourClass = mock(YourClass.class);. 테스트 클래스의 setUp() 메서드에서이 작업을 수행해야합니다.

테스트하기 전에 조롱 된 데이터로 조롱 된 클래스의 메소드를 더럽 히지 마십시오. 예 : when(mockDPclass.readFile("Consumers.json")).thenReturn(Arrays.asList(mockPerson1, mockPerson2, mockPerson3));이 값을 setUp() 메소드의 끝에 넣어야합니다. 당신은 다음과 같이 할 수 있습니다 readFileTest() 메소드에서

: https://dzone.com/articles/getting-started-mocking-java

1

일반적으로, 이유는 개체를 조롱하기 : 여기

List<Person> persons = mockDPclass.readFile("Consumers.json"); 
assertEquals(3, persons.size()); 
Person person = persons.get(0); 
assertEquals("Kelly", person.getName()); 

는 자바 조롱을 시작하는 방법 좋은 튜토리얼입니다 왜냐하면 당신이 테스트하려고하는 것에 대한 의존성과 그들을 조롱하는 것이 실제 객체를 만드는 것을 단순화시키고 기대를 제어하고 상호 작용을 점검하는 방법을 제공하기 때문입니다.

귀하의 경우 파일에서 데이터를 올바르게 읽는지 확인하기 위해 함수를 테스트하고 있습니다. 의존성은 다음과 같습니다

  • 당신이 방법
  • 에서 JSONParser 예를 당신에게 new을 읽고있는 파일 이름이 방법에
  • FileReader 예를 당신 new을 구문 분석 파일을 읽을 수 있다고 할

을 감안할 때이 당신이 할 수있는 두 가지가있다 :

1) 시험 데이터와 가짜 파일을 만드는 것이 당신은 반대합니다. 그러면 테스트 결과는 다음과 같습니다.

@Test 
public void readFileTest() { 
    DiscountPricing dp = new DiscountPricing(); 
    List<Person> emptyList = dp.readFile("test_file_empty.json"); 
    assertThat(emptyList, is(empty())); 

    List<Person> singleItemList = dp.readFile("test_file_single.json"); 
    assertThat(singleItemList, hasSize(1)); 
    // TODO: Assert state of Person at singleItemList(0) is correct 

    List<Person> multiItemList = dp.readFile("test_file_multi.json"); 
    assertThat(mutilItemList, hasSize(2)); 
    // TODO: Assert state of each person in list is correct 
} 

2)를 주입 을 허용 JSONParser 당신이 그렇게 당신이 그것을 조롱하고 테스트 할 더미 데이터를 제공 할 수 있어야합니다. 옵션은 실제 데이터에 대해 테스트 1

@Test 
public void readFileTest() { 
    JSONParser mockParser = mock(JSONParser.class); 
    DiscountPricing dp = new DiscountPricing(); 
    dp.setJSONParser(mockParser); // Parser is now a field in DiscountPricing you use in the readFile method 

    JSONObject emptyObject = new JSONObject(); 
    when(mockParser.parse(any(FileReader.class))).thenReturn(emptyObject); 
    List<Person> emptyList = dp.readFile("this doesn't matter"); 
    assertThat(emptyList, is(empty())); 

    JSONObject singleObject = new JSONObject(); 
    // TODO: Populate singleObject with fake fields 
    when(mockParser.parse(any(FileReader.class))).thenReturn(singleObject); 
    List<Person> singleItemList = dp.readFile("this doesn't matter"); 
    assertThat(singleItemList, hasSize(1)); 
    // TODO: Assert state of Person at singleItemList(0) is correct 

    JSONObject multiObject = new JSONObject(); 
    // TODO: Populate multiObject with fake fields 
    when(mockParser.parse(any(FileReader.class))).thenReturn(multiObject); 
    List<Person> multiItemList = dp.readFile("this doesn't matter"); 
    assertThat(mutilItemList, hasSize(2)); 
    // TODO: Assert state of each person in list is correct 
} 

, 그것은 코드의보다 현실적인 테스트, 그리고 그것을 설정하기 쉽다 -하지만이 테스트에서 제거 그래서 당신은 별도의 파일에 데이터를 가지고있다.

옵션으로 2을 사용하면 테스트 케이스를 코드에 명확하게 배치하여 읽기 쉽고 업데이트 할 수 있지만 코드의 모든 샘플 데이터를 가짜로 만들어야하기 때문에 좀 더 자세한 정보가 표시됩니다.

어떤 옵션을 사용할지는 주로 스타일에 달려 있으며 어떤 것이 효과가 있겠지만, 개인적으로는 1 옵션을 선호합니다.

희망 하시겠습니까?

관련 문제