2017-10-28 14 views
-1

私はクラスオブジェクトを作成するjsonオブジェクトを読み込んでいますので、クラスオブジェクトを嘲笑しています。私の方法は次のとおりです。特定のクラスオブジェクトの模擬テストに失敗しました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()メソッドで

:ここ

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

はJavaでモックを使い始めるためにどのように素敵なチュートリアルです:一般的にhttps://dzone.com/articles/getting-started-mocking-java

1

、オブジェクトをモックする理由テストしようとしているものの依存関係が必要であり、それらを嘲笑して実際のオブジェクトを作ることが簡単になり、期待をコントロールし、相互作用をチェックする方法を与えるからです。

あなたの場合、ファイルからデータを正しく読み取ることを確認する関数をテストしています。あなたの依存関係は以下のとおりです。

  • ファイル名あなたはあなたの方法でnew
  • FileReaderインスタンスを解析すると、ファイル
  • を読むためにそれを行うための方法で new
  • からJSONParserインスタンスを読んでいます

を考えると、このあなたが行うことができる2つのものがあります:

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あなたがそうあなたがそれを模擬し、反対テストするダミーデータを提供することができます必要があります。オプションで

@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 
} 

あなたが実際のデータに対してテストしている1、それはあなたのコードのより現実的なテストだし、それを設定する方が簡単です - しかし、それはあなたのテストから削除されますので、あなたは別のファイルにデータを持っています。

オプションを使用すると、テストケースをコードに明確にレイアウトして読みやすく、更新しやすくなりますが、コード内のすべてのサンプルデータを偽装する必要があるため、少し冗長です。

どのオプションを使用するかは、主にスタイルに左右されますが、あなたにとっては何が効果的ですか?おそらく、私はおそらくオプション1を個人的に好むでしょう。

希望に役立ちます!

関連する問題