2015-06-09 12 views
0

Когда я попытаюсь запустить второй пример из PowerMock Bypass Encapsulation docs, используя PowerMock 1.5.2 (который мы используем в моей компании), я сразу же получаю бросок ConstructorNotFoundException. Я попытался перейти на версию 1.6.2 с тем же результатом.Почему пример PowerMock для использования Whitebox.invokeConstructor() создает исключение ConstructorNotFoundException?

Любые идеи, что я могу делать неправильно? (Я не использую ни одну из аннотаций PowerMock, например, и запускаю Java 1.7.) Я уверен, что это должен быть простой контроль с моей стороны ...

Вот мой POM для примера из Документы:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.example</groupId> 
    <artifactId>PowerMock</artifactId> 
    <version>1.0-SNAPSHOT</version> 

<dependencies> 
    <dependency> 
     <groupId>org.powermock</groupId> 
     <artifactId>powermock-mockito-release-full</artifactId> 
     <version>1.6.2</version> 
    </dependency> 

</dependencies> 

</project> 

А вот тестовый класс:

import org.powermock.reflect.Whitebox; 

public class Test { 
    @org.junit.Test 
    public void test() throws Exception { 
     PrivateConstructorInstantiationDemo instance = Whitebox.invokeConstructor(PrivateConstructorInstantiationDemo.class, new Class<?>[]{Integer.class}, 43); 
     System.out.println(); 
    } 
} 

Вот исключение во всей своей красе:

org.powermock. reflect.exceptions.ConstructorNotFoundException: сбой , чтобы найти конструктор с типами параметров: [[Ljava.lang.Class ;, java.lang.Integer] в org.powermock.reflect.internal.WhiteboxImpl.invokeConstructor (WhiteboxImpl.java: 1354) на org.powermock.reflect.Whitebox.invokeConstructor (Whitebox.java:511) в Test.test (Test.java:6) ...

Любые идеи? Я уверен, что вещь, которую мне не хватает, очень проста ...

ответ

1

Это должно быть ошибкой в ​​примере. Глядя на подпись public static <T> T invokeConstructor(Class<T> classThatContainsTheConstructorToTest, Class<?>[] parameterTypes, Object[] arguments), вы должны передать массив объектов в качестве последнего аргумента. Я немного изменил пример, чтобы проиллюстрировать это.

Тест:

@org.junit.Test 
public void test() throws Exception { 
    PrivateConstructorInstantiationDemo instance1 = Whitebox.invokeConstructor(PrivateConstructorInstantiationDemo.class, new Class<?>[]{Integer.TYPE}, new Object[]{43}); 
    PrivateConstructorInstantiationDemo instance2 = Whitebox.invokeConstructor(PrivateConstructorInstantiationDemo.class, new Class<?>[]{Integer.class}, new Object[]{43}); 
    System.out.println(); 
} 

Класс: выход

public static class PrivateConstructorInstantiationDemo { 

    private final int state; 

    private PrivateConstructorInstantiationDemo(int state) { 
     this.state = state; 
     System.out.println("int " + state); 
    } 

    private PrivateConstructorInstantiationDemo(Integer state) { 
     this.state = state; 
     System.out.println("Integer " + state); 
     // do something else 
    } 

    public int getState() { 
     return state; 
    } 
} 

Тест:

int 43 
Integer 43 
+0

Уч. Должно было немного прокрутиться. Благодаря! :) – Christian