Я не собираюсь давать вам весь код, а просто начну.
Когда VideoStore
расширяет Video
, вы говорите, VideoStore
- это Video
, что неправильно, вы хотите сказать, что VideoStore
имеет [ 116] с. Вам нужен список Video
в вашем VideoStore
Так что ваш VideoStore
должен выглядеть примерно так:
class VideoStore {
Video[] videos = new Video[100];
void addVideo(String name) {
Video v = new Video(name);
for(int i=0; i<videos.length; i++) {
if(videos[i] == null) {
videos[i] = v;
break;
}
}
}
void doCheckout(String name) {
int index = index(name);
videos[index].setCheckout(true);
}
void doReturn(String name) {
// your code
}
void receiveRating(String name, int rating) {
// your code
}
void listInventory() {
// your code
}
int index(String name) {
// your code
}
}
И к вашему допросу:
значения массива videoStore сбрасываются после каждого выполнения, я не знаю, почему
blockquote>это нормально, они только в памяти и будут удалены после завершения программы. [1115 ]
Простой log4j.properties файл может быть похожим на это:
log4j.rootCategory=debug,console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.out
log4j.appender.console.immediateFlush=true
log4j.appender.console.encoding=UTF-8
log4j.appender.console.threshold=info
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern=%d [%t] %-5p %c - %m%n
Место это в Вашем пути к классу (папка цели/классов). Или Вы, если у Вас есть проект Знатока, помещаете его под своим src/main/resources, и Eclipse скопирует его в Ваш путь к классу.
Без конфигурационного файла, необходимо видеть, что Eclipse предупреждает в консоли как это:
log4j:WARN No appenders could be found for logger.
log4j:WARN Please initialize the log4j system properly.
Убедитесь, что ваши log4j.properties
или log4j.xml
скопированы в ваш путь к классам IDE и загружаются при вызове BasicConfigurator.configure ()
Найдите уровень журнала в файле log4j.properties
или log4j.xml
. Вероятно, установлено значение ERROR
вместо DEBUG
Настройка с помощью BasicConfigurator.configure ();
устанавливает базовый консольный аппендер, установленный при отладке. Проект с описанной выше настройкой и без другого кода (за исключением теста) должен создавать три строки журнала в консоли. Я не могу ничего сказать, кроме «у меня работает».
Вы пытались создать пустой проект только с log4j и junit, используя только приведенный выше код, и запускали его?
Кроме того, чтобы запустить метод @Before
:
@Test
public void testname() throws Exception {
assertTrue(true);
}
EDIT :
Если вы запускаете более одного теста одновременно, каждый из них будет вызывать init перед запуском.
В этом случае, если у вас было два теста, у первого был бы один регистратор, а второй тест снова вызывал бы init, заставляя его регистрировать дважды (попробуйте) - вы должны получить 9 строк регистрации в консоли с двумя тестами.
Чтобы избежать этого, вы можете использовать статический метод инициализации, помеченный @BeforeClass
. Хотя это также происходит с файлами, вы можете посмотреть документацию по TestSuites в JUnit 4. И / или вызвать BasicConfigurator.resetConfiguration ();
в аннотированном классе @AfterClass, чтобы удалить все регистраторы после каждый тестовый класс / набор тестов.
Кроме того, корневой регистратор используется повторно, поэтому, если вы установите уровень корневого регистратора в методе тестирования, который запускается раньше, он сохранит эту настройку для всех других тестов, которые запускаются позже, даже если они находятся в разных файлах. (не произойдет при сбросе конфигурации).
Testcase - это вызовет 9 строк журнала:
import static org.junit.Assert.assertTrue;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;
import org.junit.Before;
import org.junit.Test;
public class SampleTest
{
private static final Logger LOGGER = Logger.getLogger(SampleTest.class);
@Before
public void init() throws Exception
{
// Log4J junit configuration.
BasicConfigurator.configure();
}
@Test
public void testOne() throws Exception {
LOGGER.info("INFO TEST");
LOGGER.debug("DEBUG TEST");
LOGGER.error("ERROR TEST");
assertTrue(true);
}
@Test
public void testTwo() throws Exception {
LOGGER.info("INFO TEST");
LOGGER.debug("DEBUG TEST");
LOGGER.error("ERROR TEST");
assertTrue(true);
}
}
Изменение метода инициализации сокращается до шести исключенных строк:
@BeforeClass
public static void init() throws Exception
{
// Log4J junit configuration.
BasicConfigurator.configure();
}
Ваша проблема, вероятно, вызвана каким-то другим тестовым классом или набором тестов, где уровень ведения журнала корня logger установлен на ERROR и не сбрасывается.
Вы также можете проверить это, сбросив настройки в методе @BeforeClass перед настройкой входа в систему.
Имейте в виду, что эти изменения могут нарушить ожидаемое ведение журнала для других тестовых случаев, пока оно не будет исправлено во всех местах. Я предлагаю попробовать, как это работает, в отдельной рабочей области / проекте, чтобы понять, как это работает.
Проверьте файлы конфигурации log4j в каталоге вывода (т.е. bin или target / classes) или в сгенерированных артефактах проекта (.jar / .war / .ear). Если это находится в вашем пути к классам, его подхватывает log4j.
Перейдите в раздел «Выполнить конфигурации» в своем eclipse, затем аргументы -VM добавьте следующее: -Dlog4j.configuration = log4j-config_folder / log4j.xml
замените log4j-config_folder структурой вашей папки, в которой находится ваш файл log4j.xml
Следует отметить одно: если у вас есть файл log4j.properties в пути к классам, вам не нужно вызывать BasicConfigurator. Описание того, как настроить файл свойств, находится здесь .
Вы можете точно определить, является ли ваша IDE причиной проблемы, попытавшись запустить этот класс из командной строки с log4j.jar и log4j.properties в пути к классам.
Похоже, log4j выбирает другой файл конфигурации, чем тот, который вы думаете.
Поместите точку останова в log4j, где открывается файл, и посмотрите файлы getAbsolutePath ().