2012-11-14 43 views
7

Tôi đang cố gắng để có RunWith (PowerMockRunner.class) làm việc với chú thích gói hiện có của tôi.RunWith (PowerMockRunner.class) không hoạt động với chú thích gói

phiên bản:

powermock 1.4.12 Mockito 1.9.0 junit 4.8.2

package-info.java // này là dành cho gói chú thích

@TestAnnotation(version="1.0") 
package com.smin.dummy; 

TestAnnotation.java // đây là lớp chú thích siêu dữ liệu cho gói "com.smin.dummy"

package com.smin.dummy; 

import java.lang.annotation.*; 

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.PACKAGE) 
public @interface TestAnnotation { 
    String version(); 
} 

A.java

package com.smin.dummy; 

public class A { 
    private static Package myPackage; 
    private static TestAnnotation version; 

    static { 
     myPackage = TestAnnotation.class.getPackage(); 
     version = myPackage.getAnnotation(TestAnnotation.class); 
    } 

    public static String getVersion() { 
     return version.version(); 
    } 
} 

MockA.java

package com.smin.dummy; 


import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

import com.smin.dummy.A; 

@RunWith(PowerMockRunner.class) //comment out this line to see the difference 
@PrepareForTest(A.class) 
public class MockA { 
@Test 
public void test_mocked() throws Throwable { 
    String thisVersion = A.getVersion(); 
    System.out.println(thisVersion); 
} 
} 

Trong unitest MockA.java, nếu tôi không sử dụng RunWith(PowerMockRunner.class), tôi sẽ nhận được thisVersion được in 0.1 như mong đợi. Nhưng sau khi thêm RunWith(PowerMockRunner.class), thisVersion biến thành null. Tôi nghi ngờ PowerMockRunner đang làm một số điều buồn cười với chú thích gói ở đây, bất cứ ai có bất kỳ ý tưởng? xem phiên bản mini của mã của tôi dưới đây:

+4

Tôi kiểm tra các bộ nạp lớp của kiểm tra junit, khi được chú thích với '@RunWith (PowerMockRunner.class)'. Có vẻ như Powermock đang thiết lập trình nạp lớp của chính nó, và đây là cách ma thuật của việc tiêm lớp mô hình vào trong trường hợp thử nghiệm xảy ra. Tôi e là bạn đúng, gói của lớp được tạo ra bởi powermock không còn được chú thích như nó nên. – Alban

+0

@Alban tìm kiếm tốt! bất kỳ công việc xung quanh? – Shengjie

+2

Tôi không sợ. Nhìn sâu hơn vào vấn đề của bạn, tôi đã kiểm tra A.class' và phát hiện ra rằng chú thích bạn đặt trên packageis thực sự được thay thế bởi một proxy. Vì vậy, 'getAnnotation (TestAnnotation.class)' trả về null. Nếu bạn lặp qua danh sách các chú thích trên gói, không có chú thích nào là một cá thể hoặc một cá thể siêu lớp của lớp TestAnnotation.class. Chú thích thực sự nằm trên gói là proxy. Tôi không tìm được cách để hướng dẫn MockClassLoader trì hoãn trình nạp lớp hệ thống khi tải bất kỳ lớp nào khác ngoài A. Theo tài liệu java, có thể. – Alban

Trả lời

4

Xây dựng trên @ sleuthing Alban trong các ý kiến, nó trông giống như thêm chú thích này để test bạn nên phá vỡ các vấn đề:

@PowerMockIgnore("com.smin.dummy.TestAnnotation") 
Các vấn đề liên quan