You assert that something happened, but why?
TL;DR: Be explicit when creating tests to ensure clarity and maintainability
Your test depends on external data or configurations not immediately visible within the test itself.
This obscures the test’s setup, making it difficult for someone reading it to understand what is being tested and why it might fail.
Every test case should have three stages:
All of them must be explicit.
@Test
void shouldReturnAnswerWhenAnswerExists() {
User answer = KnowledgeRepository.findAnswerToQuestion(42);
assertNotNull(answer);
}
@Test
void shouldReturnAnswerWhenAnswerExists() {
KnowledgeRepository knowledgeRepository =
new InMemoryKnowledgeRepository();
Answer expectedAnswer = new Answer(42, "The Ultimate");
knowledgeRepository.save(expectedAnswer);
Answer actualAnswer = answerRepository.findAnswerToQuestion(42);
assertNotNull(actualAnswer);
assertEquals(expectedAnswer, actualAnswer);
}
You can detect this smell by looking for tests that do not clearly show their setup steps or rely heavily on external configurations.
AI-generated code often avoids this smell due to the tendency to create small, isolated examples.
Most AI Detectors fail to identify this as a problem unless you point it out explicitly.
This code smell is especially prevalent in legacy codebases or when consistent testing practices are lacking.
You need to be explicit about the environment since tests must always be in "full environmental control."
Code Smell 17 - Global Functions
Code Smell 18 - Static Functions
Code Smell 30 - Mocking Business
Coupling - The one and only software design problem
Code Smells are my opinion.
Photo by Brands&People on Unsplash
Science is what we understand well enough to explain to a computer, Art is all the rest
Donald Knuth
This article is part of the CodeSmell Series.