cover-img

Code Smell 82 - Tests Violating Encapsulation

Objects work fine and fulfill business objectives. But we need to test them. Let's break them.

3 August, 2023

0

0

0

TL;DR: Don't write methods with the only purpose of being used in your tests.

Problems

  • Encapsulation Violation.
  • Bad interfaces
  • Coupling

Solutions

  1. Don't break encapsulation.
  2. Test must be in full control.
  3. If you cannot control your object, you are coupled. Decouple them!

Sample Code

Wrong

<?

class Hangman {
private $wordToGuess;

function __construct() {
$this->wordToGuess = getRandomWord();
// Test is not in control of this
}

public function getWordToGuess(): string {
return $this->wordToGuess;
// Sadly we need to reveal this
}
}

class HangmanTest extends TestCase {
function test01WordIsGuessed() {
$hangmanGame = new Hangman();
$this->assertEquals('tests', $hangmanGame->wordToGuess());
// How can we make sure the word is guessed?
}
}

Right

<?

class Hangman {
private $wordToGuess;

function __construct(WordRandomizer $wordRandomizer) {
$this->wordToGuess = $wordRandomizer->newRandomWord();
}
}

class MockRandomizer implements WordRandomizer {
function newRandomWord(): string {
return 'tests';
}
}

class HangmanTest extends TestCase {
function test01WordIsGuessed() {
$hangmanGame = new Hangman(new MockRandomizer());
// We are in full control!
$this->assertFalse($hangmanGame->wordWasGuessed());
$hangmanGame->play('t');
$this->assertFalse($hangmanGame->wordWasGuessed());
$hangmanGame->play('e');
$this->assertFalse($hangmanGame->wordWasGuessed());
$hangmanGame->play('s');
$this->assertTrue($hangmanGame->wordWasGuessed());
// We just test behavior
}
}

Detection

This is a design smell.

We can detect we need a method just for test.

Tags

  • Information Hiding

Conclusion

White-box tests are fragile. They test implementation instead of behavior.

Relations

Code Smell 52 - Fragile Tests

Code Smell 28 - Setters

More Info

Credits

This smell was inspired by @Rodrigo

%[https://twitter.com/_rodrigomd/status/1408032157629485056]


Nothing makes a system more flexible than a suite of tests.

Robert Martin

Software Engineering Great Quotes


This article is part of the CodeSmell Series.

How to Find the Stinky Parts of your Code

0

0

0

Maxi Contieri

Buenos Aires, Argentina

🎓Learn something new every day.📆 💻CS software engineer 👷coding👨🏽‍🏫teaching ✍🏾writing 🎨Software Design 🏢SOLID 🌉TDD 👴Legacy 💩Code Smells

More Articles

Showwcase is a professional tech network with over 0 users from over 150 countries. We assist tech professionals in showcasing their unique skills through dedicated profiles and connect them with top global companies for career opportunities.

© Copyright 2024. Showcase Creators Inc. All rights reserved.