2015-12-17 2 views
0

Я пытаюсь написать тест юнита для одного из моих классов. Дизайн не был сделан мной; это довольно старое приложение, java7, struts1 и clydeDB.Как я могу создать экземпляр объекта в jUnit, который должен рефлексивно создать другой объект внутри его конструктора?

Классы настроены так: ProcessObj, IProcessObj (интерфейс), ProcessHome,

public class ProcessHome { 

    private static ProcessHome instance = new ProcessHome(); 

    //default Constructor 
    private ProcessHome() { 
    } 

    public static ProcessHome getInstance() { 
     return instance; 
    } 

    public IProcessObj getProcessObj() throws POException { 
     return ProcessObj.getInstance(); //this is below 
    } 
} 

public class ProcessObj implements IProcessObj { 
    // instance 
    private static IProcessObj instance; 
    ... 
    //constuctor 
    private ProcessObj() throws POException { 
     init(); 
    } 

    static IProcessObj getInstance() throws POException { 
     if (instance == null) { 
      instance = new ProcessObj(); 
     } 
     return instance; 
    } 
    //jUnit test setUp 

    @Before 
    public void setUp() throws Exception { 

     public static IProcessObj iPO; 
     iPAO = ProcessHome.getInstance() 
      .ProcessObj(); 

     Constructor<ProcessObj> pa = ProcessObj.class 
      .getDeclaredConstructor(); 
     pa.setAccessible(true); 
     iPO = pa.newInstance();` 

    ... 

Он отлично работает до сюда, но потом в ProcessObj, метод инициализации проходит через другой набор классов, которые настроены точно так же, как объекты процесса, которые выше, для уровня доступа к данным.

Есть ли способ создать полезный экземпляр объекта процесса? Может кто-нибудь объяснить мне, что именно здесь происходит? Я продолжаю получать InvocationTargetException.

+0

InvocationTargetException происходит при вызове 'newInstance', верно? Это означает, что конструктор (и, как вы предполагаете, метод 'init') throw и Exception (который вы можете найти, вызвав' getCause' в InvocationTargetException. Поскольку содержимое 'init' недоступно для нас, вам придется отслеживать эту причину. Исключение. – CoronA

ответ

0

Почему вы не делаете что-то вроде этого:

public class ProcessHome { 

    private static ProcessHome instance = new ProcessHome(); 

    //default Constructor 
    private ProcessHome() { 
    } 

    public static ProcessHome getInstance() { 
     return instance; 
    } 

    public IProcessObj getProcessObj() throws POException { 
     return ProcessObj.getInstance(); //this is below 
    } 
} 

public class ProcessObj implements IProcessObj { 
    // instance 
    private static IProcessObj instance; 
    ... 
    //constuctor 
    private ProcessObj() throws POException { 
     init(); 
    } 

    static IProcessObj getInstance() throws POException { 
     if (instance == null) { 
      instance = new ProcessObj(); 
     } 
     return instance; 
    } 


//jUnit test class 


public class ProcessHomeTest { 
    private IProcessObj iPO = ProcessHome.getInstance() 
      .ProcessObj(); 

    @Test 
    public void testIProcessObj() throws Exception { 
     //use iPO heretest iPO 
    assertEquals("some","some"); 
    } 
+0

Привет, Salc2 - спасибо за быстрый ответ. К сожалению, это не сработает для меня. В конструкторе ProcessObj есть еще один вызов, чтобы получить экземпляр другого объекта - объекта доступа к данным. хотел бы знать, есть ли способ издеваться над этим – jerryn44

+0

@ jerryn44 ok теперь я понимаю, возможно, если 'IProcessObj' - это интерфейс, чтобы вы могли реализовать его в инстансе анонимного класса и использовать этот объект как макет. Но я не знаю, будет ли это хорошей практикой. – salc2