2015-10-15 46 views
1

所以我有一個階級結構設置,像這樣:如何JUnit測試與內部對象創建

public class foo { 
    private DomainService service; 

    //constructor to initialize 

    public Fleet someMethod(Car car) { 
     Fleet fleet = new Fleet(); 
     if(car!=null) { 
      Plane plane = service.findObjectByID(car); 
      plane.setColor(Blue); 
      fleet.addPlane(plane); 
     } 
     return fleet; 
    } 
} 

public class DomainService { 
    List<Plane> planes; 

    //constructure to initialize 

    public Optional<Plane> findObjectByID(Car car) { 
     for(Plane plane : planes) { 
      if(plane.getID() == car.getID()) { 
       return Optional.of(plane); 
      } 
     } 
     return Optional.absent(); 
    } 
} 

public class Fleet { 
    List<Plane> planes; 
    int ID; 
    Date serviceDate; 
} 

當用戶登錄到應用程序中,有很多操作和發生計算通過Spring管理豆。他們從數據庫中提取有關用戶的所有信息並將其存儲到對象中。在上面的例子中,當用戶登錄的飛機列表是從他們從數據庫中提取的信息中填充的。

我的問題是JUnit測試這個。我的JUnit看起來像這樣:

public class fooTest { 
    private Foo foo; 
    private Car car; 

    @Before 
    public void setUp() throws Exception { 
     foo = new Foo(); 
    } 

    @Test 
    public void isBlue() { 
     car = new Car; 
     car.setID(123); 
     Fleet result = foo.someMethod(car); 
     assertEquals(Color.BLUE, result.getColor()); 
    } 
} 

問題是平面對象在用戶首次登錄時被初始化,包括平面ID。哪些是真實世界ID,是一串隨機數字和字符。由於這是一項測試,飛機沒有得到任何真實的東西。即使它充滿了真實世界的數據,我也不知道要將它設置爲什麼ID,因爲它們是隨機的。

所以我每次嘗試執行這個JUnit都會失敗,因爲findObjectByID總是返回null。

我正在研究嘲笑或ArgumentCaptor,但我是JUnit測試的新手,並不真正瞭解這些工作是如何工作的,或者他們是否能夠幫助我解決問題。有關如何解決此問題的任何想法?

回答

2

可以運行是否與Spring上下文測試:

@RunWith(SpringJUnit4ClassRunner.class) 
    @ContextConfiguration(locations = { "classpath*:spring-context.xml" }) 
    public class fooTest { 

     @Inject 
     private DomainService service; 
     [...] 

或者嘲笑你的對象,例如與Mockito框架:

@RunWith(MockitoJUnitRunner.class) 
    public class fooTest { 

     private Plane plane; 

     @Mock 
     private DomainService service; 

     @Before 
     public void setUp() { 
      plane = new Plane(); 
      when(service.findObjectByID(any(Car.class))).thenReturn(plane); 
     } 
     [...] 
+0

什麼是any()調用,因爲我得到一個語法錯誤。 – Richard

+1

any()是Mockito的一個靜態方法,說任何事情都可以通過該參數。你得到一個語法錯誤b/c它需要傳遞該參數的類,所以它應該是'any(Car.class))'。 Matchers上的文檔:https://mockito.googlecode.com/hg-history/1.6/javadoc/org/mockito/Matchers.html – emerssso