Мікробібліотека для роботи з конкатенацією в Java

💡 Усі статті, обговорення, новини про тестування — в одному місці. Приєднуйтесь до QA спільноти!

Отже, я Рома і я автоматизовую системні тести, сценарні моніторинги для будь-чого вже 10 років

І я вже десь 4 роки носив з собою шматок коду з проєкту в проєкт для роботи зі стрінгою. Мене постійно бісило в Java писати ассерт меседжі або гарні логи з лапками різними, табуляцією та в принципі конкатенувати то все ібо дуууже багато слів тре писати ну і часто провтикував закриваючі лапки ставити.

Почну з 8ї жави, в ній напевно швидше за все конкатенувати стрічки через StringBuilder, але його АПІ доволі масивний, щоб додати нове слово, речення або табуляцію окремим append("\n«) — фє.

StringBuilder strBuilder = new StringBuilder();
String targetMsg = strBuilder.append("ololo").append("\n").append("\"double quoted text\"").build();

І писати умовно таку «локшину» бісило, особливо коли текст приходить звідкись. Хотілось щось значно компактніше по свому інтерфейсу, ну і зробити так шоб це було мікро бібліотекою і будь-де собі підключати

Той самий білдіг стрічки тепер виглядатимо отак:

String targetMsg = sbb("ololo").n().dq("double quoted text").bld();

Тому тепер асерт меседжі або логі як тре робити більш логічно/читабельно можна робити, коли явно та простіше нову стрічку можна вказати

sbb().n()
    .add("Unexpected response body:").n()
    .add(targetResponse.asString()).n()
    .add("Expected body type:").w().sQuoted(expectedClass.getSimpleName()).n()
    .add("With fields:").n()
    .add(expectedClass.getDeclaredFields())
    .bld();

Під капотом це той самий StringBuilder ініціалізується потокобезпечно через внутрішній статичний клас

private SBB() {
    this.strBuilder = new StringBuilder();
}
public static SBB sbb() {
    return LazyHolder.instance;
}
private static class LazyHolder {
    private static final SBB instance = new SBB();
}
...

На проєктах де була 9+ Java — заміть StringBuilder та апендів була просто конкатенація через плюсик оскільки завдяки JEP 280 оновився механізм конкатенації через виклик invokedynamic

Тому я зроблю ще в рамках однієї ліби мультимодульний проєкт під Java 8 та умовно 9+

github.com/rmarinsky/sbb

Був би вельми вдячний код ревʼю та вашим пропозиціям.

А також зробив мікро обгортку для Playwright на Java, шоб АПІ був як в Selenide.

github.com/rmarinsky/drama

👍ПодобаєтьсяСподобалось7
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Щось я про потокобезпечність не зрозумів... що таке LazyHolder.instance підпертий this.strBuilder.setLength(0);?

    @Test
    void multipleInstances() {
        SBB sbb1 = sbb().add("111");
        SBB sbb2 = sbb().add("222");
        assertEquals("222", sbb2.bld());
    }
... падає, bld)
Expected :222
Actual   :111222

Бляха, я поняв... нахіба я то так зробив, воно ж дійно ні до чого...
Дякую за зауваження! 🙏
Виправляю.

Підписатись на коментарі