2017-01-12 7 views
1

Я написал небольшую программу, в ней несколько определенных классов. Я пишу тесты для этих классов. Конструктор, который я написал для одного из классов, имеет аргумент, являющийся экземпляром другого класса. Итак, это выглядит примерно так:Проверьте, имеет ли класс переменную-член?

interface type1 {} 
interface type2 {} 

class class1 implements type1{ 
    String something; 
    int somethingElse; 
    //... 
} 

class class2 implements type1{ 
    String something2; 
    int somethingElse2; 
    //... 
} 

class class3 implements type2{ 
    Object obj1; 
    Object obj2; 
    String blabla; 
    //... 

    class3(Object inObj1, Object inObj2, String x){ 
     this.obj1 = inObj1; 
     this.obj2 = inObj2; 
     this.blabla = x; 
    } 
} 

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

class ExamplesType1{ 
    class1 type1Something1 = new class1(...); 
    class2 type1Something2 = new class2(...); 

} 

class ExamplesType2{ 
    class3 type2Something = new class3(type1Something1, type1Something2, ...); 
} 

Мой вопрос, как я могу получить доступ к объектам, которые являются членами ExamplesType1 от ExamplesType2, так что я могу ... запустить свои тесты? Предположим, что я не могу проверить оба интерфейса в одном классе и что я не могу еще раз определить объекты, определенные в ExampleType1, в ExampleType2.

Я знаю, что могу создать функцию возврата (например, getType1Something()), но они общедоступны, поэтому я не могу получить к ним доступ без определения функции?

Извините, если это новый вопрос ... только что начал Java сегодня.

Благодарим за помощь! Если требуется какое-либо разъяснение, дайте мне знать.

+0

Было бы лучше, если бы вы придерживались соглашения об именах для имени классов и интерфейсов. Согласно Oracle: «Имена классов должны быть существительными в смешанном случае с первой буквой каждого внутреннего слова, заглавными». –

+0

Вам нужно будет создать экземпляр 'ExampleType1', прежде чем вы сможете перейти к публичным полям. Однако вы должны использовать метод getter. – 4castle

+0

Нет публичных членов вашего кода. –

ответ

1

Предположим ClassA имеет два конкретизированных классы, ClassB и ClassC, как экземпляр которого

ClassB classB = new ClassB(); 
ClassC classC = new ClassC(); 

ClassB и ClassCpublic переменных, то можно ссылаться внутри ClassA, например: classB.variableName.

Это может ссылаться на любой объект, который является public от примитивных типов к объектам.

Если классы не создаются, то переменные public должны дополнительно использовать ключевое слово static для ссылки. Эта ссылка static позволяет обойти инкапсуляцию из родительского класса и создания экземпляра.

Другими словами, ClassB может ссылаться на родительский класс, ClassA для извлечения public static экземпляра само по себе, но если это не static переменная, она должна опираться на конкретизации, статические методы геттерных или конкретизации методами геттерных для доступа эти объекты.

Надеется, что это помогает :)

+1

Ах !!! В этом есть смысл. Благодаря! – user3026388

+0

Я рад, что это помогло :) – dddJewelsbbb

0

Предположит, у вас есть два класса

class ClassA { 
    String flag; 
    ... 
} 

class ClassB { 
    String flag; 
    ... 
} 

Них у вас есть несколько вариантов, чтобы получить доступ к члену поля из этих классов.

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

  2. Вы также можете публиковать эти поля, что также позволит любому блоку кода содержать ссылки на эти классы для доступа к публичным полям.

  3. Если вы хотите, чтобы некоторые классы имели доступ к этим полям, но не все (не общедоступные), вы можете сделать их защищенными пакетами. Это позволит любому другому классу в пределах одного пакета получить доступ к этим полям, но не кому-либо еще. Чтобы защитить пакет (или метод), вы просто не указываете модификатор доступа (открытый или закрытый) для рассматриваемого поля. Вы можете прочитать больше here.

  4. Наконец, очень полезно для тестирования использовать рефлексию для доступа к закрытым членам. Отражение не очень показательно, и оно довольно хакерское, но в некоторых ситуациях оно может быть очень удобным. В основном я использовал отражение для издевательства объектов в модульных тестах, но видел, что он используется очень интересными способами.

    Поле field = MyClass.getDeclaredField ("fieldName"); field.setAccessible (true); String flag = field.get (myInstance);

PS> Написание этого в основном из памяти, но я считаю, что это должно вас заставить.

Надеюсь, это поможет! Удачи!