2015-01-14 14 views
7

tôi đang cố gắng để kết hợp Powermock như một sự phụ thuộc cho các xét nghiệm Android của tôi bằng cách sử dụng cấu hình build.gradle sau:Làm thế nào để có được Powermock để làm việc với Dexmaker

dependencies{ 
    compile 'com.android.support:appcompat-v7:21.0.+' 
    androidTestCompile('org.mockito:mockito-core:1.9.5') 
    androidTestCompile('com.google.dexmaker:dexmaker:1.2') 
    androidTestCompile('com.google.dexmaker:dexmaker-mockito:1.2') 
    androidTestCompile('org.powermock:powermock-module-junit4:1.5.5') { 
     exclude module: 'junit' 
    } 
    androidTestCompile('org.powermock:powermock-api-mockito:1.5.5') { 
     exclude module: 'mockito-all' 
    } 
} 

Tuy nhiên, trình biên dịch được phàn nàn rằng

Error:Gradle: Execution failed for task ':app:packageDebugTest'. 
> Duplicate files copied in APK mockito-extensions/org.mockito.plugins.MockMaker 
    File 1: ~/.gradle/caches/modules-2/files-2.1/com.google.dexmaker/dexmaker-mockito/1.2/b99884a4c6ef6335ba376f79aa79632b2421c17c/dexmaker-mockito-1.2.jar 
    File 2: ~/.gradle/caches/modules-2/files-2.1/com.google.dexmaker/dexmaker-mockito/1.2/b99884a4c6ef6335ba376f79aa79632b2421c17c/dexmaker-mockito-1.2.jar 

Nhìn vào cấu trúc bình, tôi nhận thấy rằng cả Dexmaker và Powermock đều khai báo một số MockMaker trong mockito-extensions

img

MockMaker là gì? Chúng khác nhau như thế nào? Và câu hỏi quan trọng nhất: Có thể làm cho Powermock hoạt động tốt với Dexmaker không?

Xin cảm ơn trước. Mọi sự trợ giúp sẽ rất được trân trọng.

Trả lời

9

MockMaker là một mô-đun keo tích hợp công cụ dexmaker với Mockito. Nó làm những gì cần thiết cho Mockito để tạo ra các lớp cụ thể với các tệp Dalvik .dex thay vì các tệp .class của JVM.

Có thể Powermock sẽ hoạt động với Dexmaker, nhưng các tính năng Powermock nâng cao sẽ không hoạt động. Đặc biệt, Powermock advertises this:

PowerMock sử dụng một classloader tùy chỉnh và thao tác bytecode để cho phép mocking các phương pháp tĩnh, nhà thầu, các lớp học chính thức và phương pháp, phương pháp tư nhân, loại bỏ các initializers tĩnh và nhiều hơn nữa.

Trình tải lớp tùy chỉnh này có thể không hoạt động trên dalvikvm.

1

Tôi gặp sự cố tương tự và tôi chỉ tìm thấy giải pháp here. Nó liên quan đến một chút công việc thủ công và bạn sẽ phải tự sửa đổi tệp jar.

Vì vậy, những gì nparihar gợi ý như sau.

  1. Hãy bản sao lưu của powermock-api-Mockito-1.5.5.jar
  2. Rename powermock-api-Mockito-1.5.5.jar để powermock-api-mockito-1.5.5.zip
  3. Unzip powermock-api-mockito-1.5.5.zip
  4. cd powermock-api-Mockito-1.5.5/
  5. rm -rf Mockito-extensions
  6. jar cf powermock-api-Mockito-1.5.5 .jar META-INF/org/
  7. đặt bình mới vào trong thư mục libs của bạn.

Giải pháp này phù hợp với tôi. Hãy cho tôi biết nếu nó hoạt động cho bạn là tốt.

Ngoài ra, tôi có thể thấy rằng chúng tôi đang sử dụng cùng một phụ thuộc. Trong trường hợp của tôi, tôi đã phải gỡ bỏ thủ công tệp hamcrest.jar và objenesis.jar vì đã có các confilcts.

Hy vọng điều đó sẽ hữu ích.

+0

được bạn gợi ý Dalvik sau đó sẽ cho phép việc sử dụng chức năng này và nó có thể ghi đè lên các phương pháp cuối cùng, cho thí dụ? –

3

bạn có thể thử đặt này trong build.gradle của bạn, nó giải quyết với tôi cùng một vấn đề

android{ 
... 

packagingOptions{ 
    exclude 'mockito-extensions/org.mockito.plugins.MockMaker' 
} 

... 

} 
Các vấn đề liên quan