2017-08-08 12 views
0

私はMockitoとTDDを学ぼうとしています。ブルートゥースが有効になっているかどうかを確認するMockitoテスト

Iは方法とプレゼンタを有する:

@Override 
    public void startScanning() { 
     if (isLocationPermissionGranted() && isBluetoothEnabled()) { 
      mPresenterView.onStartScanBtnClick(); 
     } else if (!isBluetoothEnabled()) { 
      mPresenterView.displayDialogRequestingBluetooth(); 
     } else if (!isLocationPermissionGranted()) { 
      mPresenterView.displayDialogRequestingPermission(); 
     } 
    } 

    @Override 
    public boolean isLocationPermissionGranted() { 
     return false; 
    } 

    @Override 
    public boolean isBluetoothEnabled() { 
     return false; 
    } 

質問私はMockito RoboelectricまたはW/Eを使用して、底部の2つの方法を試験する方法です。

@Before 
    public void setUp() { 
     MockitoAnnotations.initMocks(this); 

     mScanningPresenter = new ScanningPresenter(mView); 

     mockBluetoothAdapter = PowerMockito.mock(BluetoothAdapter.class); 
    } 



    @Test 
    public void shouldPassPowerMock() { 

     assertEquals(true, mockBluetoothAdapter != null); 
    } 

    @Test 
    public void shouldDisplayBluetoothRequestWhenDisabled() { 

     mScanningPresenter.startScanning(); 

     PowerMockito.when(!mockBluetoothAdapter.isEnabled()).thenReturn(false); 

     verify(mView).displayDialogRequestingBluetooth(); 
    } 

私がPowerMockを追加し、それが働いています^^そして、私は私が何をしたいのかを示すテストを追加しているが、私の考えがどのようにまだ

知らないことを確認するテストを作成しましたこのインタフェースメソッドをプレゼンターの保護メソッドとして作成し、MockingClassを作成します。または、別個のインターフェイスヘルパーを作成し、それを嘲笑してください。

私は清潔な解決策/命題に対しては心が開いています。

答えて

1

私は誰かが、私はすぐにエピソード3でアナキンとパドメの言葉を考え、新しいプロジェクトのためにPowermockitoの使用を開始見るたび:

padme vs anakin

あなたは、私ができない道を行っていますただ古き良きJavaとMockitoあなたが

:-) - ここPowermockitoの必要はありません

に従ってくださいあなたの発表者にはおそらく別のクラスに抽出されるべきいくつかのパブリックメソッドがあります。プレゼンターの最良の種類は、自分のアクションを他のクラスに委譲し、showメソッドを使用してそのビューを操作するだけです。これは発表者の一人の責任です。その後

class PermissionsChecker { 

    private final Context context; 

    PermissionsChecker(Context context) { 
     this.context = context; 
    } 

    public boolean isLocationPermissionGranted() { 
     if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) 
      return false; 
     if (context.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) 
      return false; 
     return true; 
    } 
} 

:あなたは簡単にこのような何かを行うことができ

class BluetoothAdapterWrapper { 

    private final BluetoothAdapter bluetoothAdapter; 

    BluetoothAdapterWrapper(BluetoothAdapater adapter) { 
     this.bluetoothAdapter = adatper; 
    } 

    public boolean isBluetoothEnabled() { 
     return bluetoothAdapter.isEnabled(); 
    } 
} 

今、あなたのプレゼンターは、このようなものになります。

class ScanningPresenter { 

    private final ScanningView scanningView; 
    private final PermissionsChecker permissionsChecker; 
    private final BluetoothAdapterWrapper bluetoothAdapterWrapper; 

    ScanningPresenter(ScanningView scanningView, PermissionsChecker permissionsChecker, BluetoothAdapterWrapper bluetoothAdapterWrapper) { 
     this.scanningView = scanningView; 
     this.permissionsChecker = permissionsChecker; 
     this.bluetoothAdapterWrapper = bluetoothAdapterWrapper; 
    } 

    @Override 
    public void startScanning() { 
     if (isLocationPermissionGranted() && isBluetoothEnabled()) { 
      scanningView.onStartScanBtnClick(); 
     } else if (!isBluetoothEnabled()) { 
      scanningView.displayDialogRequestingBluetooth(); 
     } else if (!isLocationPermissionGranted()) { 
      scanningView.displayDialogRequestingPermission(); 
     } 
    } 

    @Override 
    public boolean isLocationPermissionGranted() { 
     return permissionsChecker.isLocationPermissionGranted(); 
    } 

    @Override 
    public boolean isBluetoothEnabled() { 
     return bluetoothAdapterWrapper.isEnabled(); 
    } 
} 

をあなたは今、私たちも、それらが公共の必要はありません注意してくださいプレゼンターの方法 - プレゼンターの契約から削除し、非公開にしたり、必要であれば完全に取り除くことができます。

@Mock PermissionsChecker mockPermissionsChecker; 
@Mock BluetoothAdapterWrapper mockBluetoothAdapterWrapper; 
@Mock ScanningView mockScanningView; 

//system under test 
ScanningPresenter scanningPresenter; 

@Before 
public void setUp() { 
    MockitoAnnotations.init(this); 
    scanningPresenter = new ScanningPresenter(mockScanningView, mockPermissionsChecker, mockBluetoothAdapterWrapper); 
} 

@Test 
public void shouldDisplayBluetoothRequestWhenDisabled() { 
    //arrange 
    when(mockBluetoothAdapter.isEnabled()).thenReturn(false); 

    //act 
    mScanningPresenter.startScanning(); 

    //assert 
    verify(mockScanningView).displayDialogRequestingBluetooth(); 
} 
+0

くそー:

今、あなたのテストは次のようになります。超良い応答。 「ありがとう、私の主人」 – Esperanz0

関連する問題