Posts Tagged ‘java’

@java: reference cards from dzone download in one place

Sunday, August 22nd, 2010

Hi, guys!

You could noticed that access to the great java reference cards at http://refcardz.dzone.com is quite comprehensive. Firstly you need register, then choose a card, then get email, and only then get a straight link to download and then make downloading.

For you I have just downloaded all rather interesting cards (on java domain) and shared them at jazzteam conpany sourceforge open source educational project JazzTeamEdu. Please consider which cards you want here https://jazzteamedu.svn.sourceforge.net/svnroot/jazzteamedu/JazzTeamLibrary/java%20literature/refcards/

Below you could find a list of cards to be used:

rc001-gwt_style_online.pdf
rc002-ajax_online.pdf
rc003-eclipse_online.pdf
rc004-spring_online.pdf
rc007-jquery_online.pdf
rc008-designpatterns_online.pdf
rc015-groovy_online.pdf
rc017-adobeflex_online.pdf
rc019-corecss1_online.pdf
rc020-010d-struts2_0.pdf
rc021-JSF_Online.pdf
rc022-JPA_Online.pdf
rc023-php_online.pdf
rc024-corejava_online.pdf
rc025-corecss2_online.pdf
rc026-springannot_online.pdf
rc028-010d-junit_0.pdf
rc029-010d-mysql.pdf
rc030-010d-ruby.pdf
rc031-010d-seam_2.pdf
rc032-010d-hibernate_search_0_1.pdf
rc033-010d-jsp.pdf
rc034-010d-css3.pdf
rc035-010d-xml.pdf
rc037-010d-equinox.pdf
rc038-010d-soa.pdf
rc039-010d-emf.pdf
rc042-010d-seam_ui_6.pdf
rc044-010d-richfaces_0.pdf
rc047-010d-enterprise_integration_patterns_1.pdf
rc050-010d-scrum_2.pdf
rc055-010d-apachemaven-1.pdf
rc057-010d-springdm_0.pdf
rc058-010d-jsf2.pdf
rc059-010d-drupal_1.pdf
rc060-010d-getting-started-grails_2.pdf
rc061-010d-java_concurrency_1.pdf
rc062-010-eclipse_rcp_0.pdf
rc064-010d-core_html_1.pdf
rc070-010d-eclipse-plugin-dev_0.pdf
rc076-010d-domain-driven-design_2.pdf
rc077-010d-bpel.pdf
rc078-010d-virtualization_1.pdf
rc079-010d-google-app-engine-4.pdf
rc081-010d-fsharp.pdf
rc082-010d-cloud-computing-1.pdf
rc083-010d-cdi-java_5.pdf
rc084-010d-continuous-integration_1_0.pdf
rc086-springwebflow_refcardv4.pdf
rc087-010d-ci_servers_tools_0.pdf
rc089-010d-zendframework-2.pdf
rc094-010d-git_1.pdf
rc095-010d-javaguidev_1.pdf
rc098-010d-repositorymanagement_0.pdf
rc099-010d-javaeesecurity_5.pdf
rc101-010d-jdbc_0.pdf
rc104-010d-apacheant_1.pdf
rc106-010d-springsecurity_2.pdf

@Java: JUnit

Friday, August 20th, 2010

Здравствуйте!
Всем любителям юнит-тестирования рекомендую почитать статью http://www.interface.ru/home.asp?artId=6561 под названием “Переходим на JUnit 4 (исходники)”.

Приведу несколько примеров, которые позволяют быстрее создавать тесты:
1) Параметр expected аннотации @Test, например
@Test(expected=IndexOutOfBoundsException.class)

Например, если у нас есть такой класс

public class SimpleStupidBean {
	public void throwableMethod() {
		throw new IllegalArgumentException();
	}
}

то раньше, чтобы проверить, что действительно выбросился нужный тип исключения при вызове метода, мы делали:

	@Test
	public void testOldStyleExceptionCheck() throws Exception {
		try {
			bean.throwableMethod();
		} catch (Exception e) {
			Assert.assertTrue(e instanceof IllegalArgumentException);
		}
	}

В случае JUnit3.x вместо @Test, Assert.assertTrue мы использовали другой подход – наследовались от TestCase, делали название тест-метода начинающимся с test, и использовали унаследованный метод assertTrue с теми жа аргументами :)

Вообще reflexion в java приобретает всё большую силу. Такие серьёзные фреймворки, как Seam, Spring, Hibernate, EclipseLink обязаны своей серьёзностью использованию reflexion. Вот и создатели JUnit решили взять себя в руки.

2) Ещё один пример, демонстрирующий, как запускать тесты в сьюте – то есть несколько тестов за один раз.

Раньше мы это делали примерно так:

public class JUnit4SuiteOldStyleRunner {
	@Test
	public static TestSuite suite() {
		TestSuite suite = new TestSuite(JUnit4SuiteModernRunner.class.getName());

		suite.addTestSuite(JUnit4Tester.class);

		return suite;
	}
}

А сейчас – всё намного быстрее!

@RunWith(Suite.class)
@SuiteClasses({ JUnit4Tester.class })
public class JUnit4SuiteModernRunner {
}

Кстати, вот здесь http://junit.sourceforge.net/doc/faq/faq.htm лежит очень и очень хороший FAQ по тестам, а ещё из вкусненького – обратите внимание на аддоны к стандартному junit4, которые лежат по адресу http://junit-addons.sourceforge.net/ которые позволяют делать вот такие вот дела:

DirectorySuiteBuilder builder = new DirectorySuiteBuilder();
builder.setSuffix("Test");
Test suite = builer.suite("/home/project/myproject/tests"); 

Из ссылочек могу посоветовать вот такую, говорящую саму за себя http://www.delicious.com/Zmicer/junit

3) Для самых любознательных и терпеливых – расскажу о параметризованных тестах. Прошу любить и жаловать. Вначале нам нужно составить тест, притом в качестве данных он должен использовать приватные члены класса

Вначале – метод, который мы тестируем

/**
* Get length of string without checking on null.
*
* @param str
* @return
*/
public int getStringLength(final String str) {
return str.length();
}

Далее – объявляем статический метод, возвращающий пары тестовых значений.

@Parameters
public static Collection getParams() {
// check extreme values.
return Arrays.asList(new Object[][] { { null, -1 }, { "", 0 }, { "123", 3 } });
}

Ещё нам нужны переменные – члены этого класса, которые будут принимать значение. По задумке, первое значение – это строка, а второе – код выполнения. Если -1 – значит тест должен проверять на исключение. А также конструктор, передающий параметры членам класса, и специальная аннотация уровня класса, говорящая, как запускать тест.

@RunWith(Parameterized.class)
@RunWith(Parameterized.class)
public class JUnit4Tester {
private SimpleStupidBean bean = new SimpleStupidBean();

private String stringToCheck;
private int resultCode;

public JUnit4Tester(String toCheck, int result) {
stringToCheck = toCheck;
resultCode = result;
}

А теперь – сам тест. В статье, на которуя я ссылаюсь вначале этого поста, нет generic примера обработки параметров, поэтому исправляю ситуацию:


@Test
public void checkParameters() throws Exception {
int realResult;
try {
realResult = bean.getStringLength(stringToCheck);
if (realResult == -1) {
// error - exception should have been thrown...
// here we even could add type of exception - for this we need change getParams method
Assert.fail("Exception should have been occur for the string [" + stringToCheck + "]");
}
Assert.assertEquals(realResult, resultCode);
} catch (Exception e) {
if (resultCode != -1) {
// it is not ok, -1 says to us that exception should occur, but here we do not have -1 in the expected
// result value.
Assert.fail("Exception [" + e.getMessage() + "] occurred for string [" + stringToCheck
+ "], but result should have been [" + resultCode + "]");
}
}
}

Результат работы параметризованного теста

Мы видим, что тест выполнялся на каждом наборе тестовых параметров, что может быть дико удобно – так как параметры у нас поставляются в методе, и никто уже тут не мешает брать их из xml, базы данных или интегрировать с другими тестовыми фреймворками.

В конце – расскажу вот такую деталь. Если вы смешали в одном классе два подхода – используя аннотации и старый, когда мы наследовались от базового класса TestCase, входящего в состав JUnit, то знайте, что аннотации тут работать не будут. При запуске вы увидите только методы, начинающиеся с test.

Все примеры можно найти по следующему SVN адресу:
https://jazzteamedu.svn.sourceforge.net/svnroot/jazzteamedu/

А внутри репозитория путь такой \JazzTeamEdu\src\org\jazzteam\edu\junit4\