2015-11-30 100 views
3

我在試圖編寫JUnit測試時偶然發現了這一點。無可否認,這是我在JUnit中的第一次單元測試,但我確實發現這種行爲非常令人費解。Android PointF構造函數不能在JUnit測試中工作

package com.example.dom.pointfbugrepro; 

import android.graphics.PointF; 
import org.junit.Test; 
import static org.junit.Assert.*; 

public class ExampleUnitTest { 
    @Test 
    public void pointf_isCorrect() throws Exception { 
     PointF foo = new PointF(5, 0); 
     assertEquals(5, foo.x, 0.0001f); 
    } 
} 

運行該測試在一個全新的Android項目導致斷言失敗:

java.lang.AssertionError: 
Expected :5.0 
Actual :0.0 

一件事,我發現在調查這個問題是分配到的PointF實例的x場直接做工作。

那麼這裏有什麼問題?爲什麼構造函數沒有正確設置字段?我該如何測試使用PointF Android類的類?

+0

您是否嘗試過使用調試器查看'PointF'對象? –

+0

@StefanBirkner是的,它說這些字段都是'0.0'。 – dom96

+0

你能在構造函數的第一行設置一個斷點嗎? –

回答

2

http://tools.android.com/tech-docs/unit-testing-support#TOC-Method-...-not-mocked.-

當您運行單元測試,使用的是Android的罐子的虛擬版本。通常情況下,您會看到「Method ... not mocked」異常,但由於您直接訪問公共字段,因此這些只是默認值。

根據您的要求,您可以只使用一個假的:你自己的擴展子類的PointF

public static class FakePointF extends PointF { 
     FakePointF(float x, float y) { 
      this.x = x; 
      this.y = y; 
     } 
    } 

但在一個更復雜的測試,你可能會最終不得不嘲笑了一大堆的其他方法。

解決方案並不十分漂亮:您需要針對仿真器或設備運行插裝測試,或者轉向使用Robolectric等測試運行器替代'shadows'的代碼。

另請參閱此StackOverflow答案:android.graphics.Point: all methods are stubs

+1

謝謝!這就說得通了。雖然很煩人,但希望它至少能提供像''PointF''這樣的簡單類的實現。 – dom96

0

我真的很驚訝,有些課程在JUnit測試中表現得如此。在Point這類簡單的DTO類的情況下,我認爲沒有什麼好的理由,但應將其視爲令人討厭的Easter雞蛋,這會讓程序員的生活變得更加困難。我會接受像Draw等方法被嘲笑,因爲它們可能嚴重依賴於硬件,但是這樣的DTO不應該被嘲笑。

我仍然在學習Android開發,但我看到的東西越多,我越相信它不是一個成熟的,思想深刻的框架。