публичный метод возвращает частный экземпляр класса в Java? - PullRequest
0 голосов
/ 24 марта 2011

У меня есть метод, который возвращает экземпляр закрытого класса, и мне нужен доступ к его методам из другого пакета для модульного тестирования. Эти классы живут в одном файле. Это выглядит так:

файл: A.java

public class A{
    B b;
    public B getB(){
        return b;
    }  
    public setB(B b){
        this->b = b;
   }
}

class B{
    C c;
    public C getC(){
        return c;
    }
    public setC(C c){
        this->c = c;
   }
}

class C{
    public int getInt(){
        return 1;
    }
}

Итак ... По сути, вопрос в том, достижимы ли какие-либо методы в B или C? Обязан ли я размещать B и C в разных файлах и делать их общедоступными для достижения этой цели?

Ответы [ 4 ]

1 голос
/ 24 марта 2011

ВСЕГДА рекомендуется размещать исходный код для каждого класса верхнего уровня в отдельном файле.Если вы этого не сделаете, вы можете столкнуться с трудностями при компиляции и т. Д.

Существует отдельный вопрос о том, нужно ли * * * * * * public, чтобы вы могли создавать модульные тесты.Я бы сказал, что это, вероятно, хорошая идея, но есть несколько способов:

  • Если вы поместите модульные тесты в тот же пакет Java, что и классы A, B и C, тогда классы (и их методы) будут видны для модульных тестов.

  • Вы можете представить методы, создав public подклассы B и C для целей тестирования.Они должны быть объявлены в том же пакете Java, что и классы A, B и C.

  • Вы можете создавать экземпляры B и C ивызвать методы на них, используя отражение.(Но это большая работа для модульного теста, и я бы НЕ рекомендовал это!)Вы можете поместить тестовые классы в тот же пакет, что и A, B и C, не смешивая кодовые базы.При сборке для производства / выпуска вы просто оставляете классы в дереве тестов вне сборки.


    Кстати, в вашем примере классы B и C являются "пакетом"частный ", а не" частный ".Модульное тестирование реального «частного» класса - это совсем другая проблема.

1 голос
/ 24 марта 2011

Вы хотите использовать Reflection для тестирования приватных методов с модульным тестированием. Вы можете прочитать больше здесь (см. Ответ):

Как проверить класс с закрытыми методами, полями или внутренними классами?

0 голосов
/ 24 марта 2011

Технически классы защищены;так что, пока классы, которые вызывают getB и getC, находятся в одном пакете, у вас не будет никаких проблем.Если из другого пакета вы попытались запустить GetB GetC, у вас возникнут некоторые проблемы, поскольку ваш другой пакет не сможет получить доступ к фактическому классу.

Здесь TestProt НЕ МОЖЕТ быть импортирован, поскольку он защищен в пакете tester2.,ФАЙЛ1:

package tester; 
import tester2.Test; 
public class Testing {   
  public Testing() {
    Test t = new Test();
    TestProt p = t.prot();   
  } 
}

ФАЙЛ2:

package tester2;
public class Test {
  public TestProt prot() {
    return new TestProt();
  } 
}

class TestProt{
  public TestProt() {
  } 
}
0 голосов
/ 24 марта 2011

Да, вы можете использовать отражение , чтобы вызывать все методы в любом случае B или C где угодно, но это, с моей точки зрения, является хакома не техника.

В противном случае, классы B и C не отображаются вне вашего A.class .

...